0
我正在写一个应用程序,使用低延迟的ASIO卡获取声音数据。低等待时间意味着每批只有128个采样,对于48k采样率。从ASIO卡,我得到32位有符号整数范围的原始样本。waveOutWrite兼容ASIO?
现在我想听通过ASIO卡发出的声音,但不是在ASIO卡上,而是在Windows中的默认输出设备上。我正在使用WAVE_FORMAT_PCM设置waveOutWrite,并使用与ASIO输入相同的特性。每当我得到一个新的128个样本的批次时,我都会这样称呼它。现在,因为Wav格式不允许使用32位整数样本,所以我将它们降级到16位。
HWAVEOUT waveOut;
void startListening(){
WAVEFORMATEX format;
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = 1;
format.nSamplesPerSec = sampleRate;
format.nAvgBytesPerSec = sampleRate * 2;
format.nBlockAlign = 2;
format.wBitsPerSample = 16;
format.cbSize = 0;
MMRESULT result = waveOutOpen(waveOut, WAVE_MAPPER, &format, 0, 0, CALLBACK_NULL);
if(result != MMSYSERR_NOERROR){
return;
}
}
typedef struct{
short *buffer;
int length;
HWAVEOUT waveOut;
} ListenInfo;
void newListeningData(void *buffer, int length){
ListenInfo *listenInfo = new ListenInfo();
listenInfo->buffer = new short[length];
listenInfo->length = length;
listenInfo->waveOut = *waveOut;
if(bitrate == 32){
int *bufferInt = (int *)buffer;
for(int i = 0; i < length; i++){
listenInfo->buffer[i] = (bufferInt[i]);
}
CreateThread(NULL, 0, &(listen), listenInfo, 0, NULL);
}
else if(bitrate == 16){
memcpy(listenInfo->buffer, (short *)buffer, length * 2);
CreateThread(NULL, 0, &(listen), listenInfo, 0, NULL);
}
else{
printf("%d: Bitrate is not 16 or 32!\n", index);
}
}
DWORD WINAPI listen(__in LPVOID lpParameter){
ListenInfo *info = (ListenInfo *)lpParameter;
WAVEHDR header;
memset(&header, 0, sizeof(WAVEHDR));
header.dwBufferLength = info->length;
header.lpData = (char *)(info->buffer);
MMRESULT result = waveOutPrepareHeader(info->waveOut, &header, sizeof(WAVEHDR));
result = waveOutWrite(info->waveOut, &header, sizeof(WAVEHDR));
while(waveOutUnprepareHeader(info->waveOut, &header, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING){
Sleep(10);
}
delete[] info->buffer;
delete info;
return 0;
}
问题是,我只能听到严重的剪辑和吱吱声。声音扭曲得无法辨认。我知道这不是同步错误,因为我也将样本保存到具有相同特征的wav文件中,并且声音以相同的方式失真。
如何将带符号的32位样本转换为waveOutWrite可以播放的内容?
您正在复制32位样本的两个*最少*有效字节。你还最好检查它是否不漂浮。 – 2012-04-22 20:34:31
@Hans我意识到了排序,并且我知道我正以小端语言获取数据。这里应该没问题。 – 2012-04-22 20:38:28