怎样用wavein和waveout分别指定不同的声卡呀?我现在要用wavein指定到一个固定的虚拟声卡去,用waveout指定到真实声卡,请问怎样寻找真实声卡?怎样指定真实声卡?还有如果系统默认声卡不是我的虚拟声卡我怎么更改默认为虚拟声卡呢?
解决方案 »
- FastReport 为什么图片大于2.22MB时,会出现JPEG ERROR #53?
- 初学delphi 遇到pascal语言的时候很难理解。
- 请教DELPHI高手,如何让程序在非XP系统中使用XP的风格界面?
- 各位,新年好,如何将richedit中内容带格式保存到access中?
- datamodule中DataModuleCreate为什么不执行?
- 我用ADO连接服务器上的SQL SERVER 请问 客户端需要安装SQL SERVER 吗
- 关于数据库路径的部题,请帮忙解决。
- 请问谁知道哪里有可以将.rm 文件转换成.avi文件的工具,在线等!
- 请问如何使用拼音来查询记录!
- 求救,关于ADOQuery的问题
- dbExpress的几个简单问题
- 求助一个关于求平均分的程序?
WaveOut(输出)那就想多大就多大,不超过内存即可。WaveOut:WaveOutOpen(FWaveID, 0, @FFormat, Handle, 0, CALLBACK_WINDOW or WAVE_MAPPED); //用这个Flag//对应的消息是:MM_WOM_DONE
//procedure WaveOutCallback(var msg: TMessage); message MM_WOM_DONE;
procedure TWaveOut.WaveOutCallback(var msg: TMessage);
var
Header: PWaveHdr;
begin
Header := PWaveHdr(msg.LParam);
try
if FActive then
begin
WaveOutUnPrepareHeader(FWaveID^, Header, SizeOf(TWaveHdr));
//再继续输出,就是增加输出Buffer
AutoPlayBuffer;
end;
finally
DeleteBuffer(Header); //删除/Free指针
end;
end;还有错误处理,只要调用对应的GetErrorText即可,不要用上面的raiseException(ErrorCode)函数了。function GetLen(S: string): Integer;
var
Len: Integer;
begin
Result := 1;
Len := Length(S);
while not (S[Result] = #0) and (Result < Len) do Inc(Result);
end;procedure TWaveOut.CheckError(Res: Integer);
var
S: string;
begin
if Res <> 0 then
begin
SetLength(S, MAXERRORLENGTH);
waveOutGetErrorText(Res, PChar(S), MAXERRORLENGTH);
//waveInGetErrorText(Res, PChar(S), MAXERRORLENGTH);
SetLength(msg, GetLen(msg));
raise EWaveException.Create(msg);
end;
end;Wave一般操作是:
New(WaveID); //var WaveID: PInteger;
WaveInOpen/WaveOutOpen打开这个WaveID,并为它提供消息回调
之后
WaveIn: 在回调函数中,进行录音数据处理(数据在消息的LParam, WParam中)
,因为在作存数据(Buffer),所以要增加一定的Buffer给它,waveInPrepareHeader-->waveInAddBuffer
然后就可能WaveInStart了。WaveOut简单,打开后就直接WaveOutPrepareHeader-->WaveOutWrite
UINT uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwCallbackInstance,
DWORD fdwOpen
);MMRESULT waveOutOpen( LPHWAVEOUT phwo,
UINT uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwCallbackInstance,
DWORD fdwOpen
);第二个参数就是指定设备ID的,0,1,2....
waveInGetNumDevs
得到输入设备数目,然后使用
MMRESULT waveInGetDevCaps(
UINT uDeviceID,
LPWAVEINCAPS pwic,
UINT cbwic
);得到一个WAVEINCAPS结构体变量的值。
typedef struct {
WORD wMid;
WORD wPid;
MMVERSION vDriverVersion;
CHAR szPname[MAXPNAMELEN]; //这个是产品名称。
DWORD dwFormats;
WORD wChannels;
WORD wReserved1;
} WAVEINCAPS;
(DWORD)handle, 0, CALLBACK_WINDOW) != MMSYSERR_NOERROR)
打开默认录音设备,用
if (waveInGetDevCaps(WAVE_MAPPER,&pwic,sizeof(WAVEINCAPS))!= MMSYSERR_NOERROR),怎么得到的pwic.szPname是:微软 声音映射器。怎么会这样呀,我要确认的是当前系统默认录音设备是否是我需要用的声卡驱动,得到这样的字符串我就无法确认了。再次麻烦你了
比如你有三个输入设备,那么ID号就是0,1,2
if (waveInOpen (&hwi, WAVE_MAPPER, &waveformat,
(DWORD)handle, 0, CALLBACK_WINDOW) != MMSYSERR_NOERROR)
来打开默认设备,但是这样用
waveInGetDevCaps(WAVE_MAPPER,&pwic,sizeof(WAVEINCAPS)就返回不了当前设备名称,请问怎么解决?输入设备的名称好像是按名称排列的,对应的ID就是排列顺序,那么不同机器中同一个设备的ID可能不同,一直用这个ID号好像行不通吧。