低レイテンシASIOカードを使用してサウンドデータを取得するアプリケーションを作成しています。低レイテンシとは、48kサンプル・レートの場合、バッチ当たりわずか128サンプルしか得られないということです。 ASIOカードからは、32ビット符号付き整数範囲のサンプルを取得します。waveOutWriteはASIOと互換性がありますか?
ASIOカードではなく、ASIOカードではなく、Windowsのデフォルト出力デバイスからの音声を聞きたい。私はwaveOutWriteをWAVE_FORMAT_PCMで設定し、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ビットのサンプルの2つの最下位*有効バイトをコピーします。また浮動していないかどうかをよく確認してください。 –
@ハンス私はエンディアンを認識しており、私はリトルエンディアンでデータを取得していることを知っています。ここに問題はないはずです。 –