2012-04-14 17 views
0

低レイテンシ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で再生できるものに変換するにはどうすればよいですか?

+0

32ビットのサンプルの2つの最下位*有効バイトをコピーします。また浮動していないかどうかをよく確認してください。 –

+0

@ハンス私はエンディアンを認識しており、私はリトルエンディアンでデータを取得していることを知っています。ここに問題はないはずです。 –

答えて

0

問題は、私が使用していたと信じられていたよりも異なるビットレートを使用していたことが原因です。正しい値でWAVEFORMATEXを修正したとき、それは機能しました!

関連する問題