0

USBオーディオカードを使用してデータを記録するCc ++のプログラムがありました。Windows XP で完全に動作します。今、私はそれをWindows7に移動する必要があります。Win7 はそのカードからデータを取得しないため、この問題を解決するために ASIO ドライバーをインストールしました。そこで、Cooledit Pro でデータを取得しようとしましたが、うまくいきました。しかし、私のプログラムでは入力データが壊れています。フロー機能を使用してデータを取得しています:

    void __fastcall AudioIn :: onMessage(TMessage & message) {
    if(message.Msg == MM_WIM_DATA && ! Terminated) {
    if(callback)
    callback(((WAVEHDR *)message.LParam) -> lpData,
       ((WAVEHDR *)message.LParam) -> dwBytesRecorded / 2);}

残念ながら((WAVEHDR *)message.LParam) -> lpDataのようなもので構成されていますЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЃ。私の間違いはどこですか?

追加コードの追加:
1) USB デバイスが見つかりました

    for(int i = 0; deviceId == -1 && i < devNum; i ++)
    if(AudioDev :: getDevCaps(i).UpperCase().Pos(L"USB"))
      deviceId = i;
    zvvi -> initDevice(deviceId);

2) このデバイスを初期化します

    initDevice(int deviceId) {
    if(wiState != wisClosed) closeDevice();
    wiDevice = deviceId;
    thread = new AudioIn(true);
    thread -> FreeOnTerminate = true;
    thread -> setCallback(callback);
    thread -> Start();}

3)WAVEHDRの準備

    void __fastcall AudioIn :: prepareHeaders(int bCount, int bSize) {
    if(prepared)
    return;
    prepared = true;

    wiBuffCount = bCount;
    wiBuffSize = bSize;

    wavehdr = new WAVEHDR[wiBuffCount];
    buff = new char *[wiBuffCount];
    for(int i = 0; i < wiBuffCount; i ++)
    buff[i] = new char[wiBuffSize];

    for(int i = 0; i < wiBuffCount; i ++) {
    wavehdr[i].lpData = (char *)buff[i];
    wavehdr[i].dwBufferLength = wiBuffSize * sizeof(* buff[i]);
    wavehdr[i].dwLoops = 0;
    wavehdr[i].dwFlags = 0;
    check(waveInPrepareHeader(wiHandle, & wavehdr[i], sizeof(wavehdr[i])), L"wiPrepareHeader");
    }
  }

4)また、デバイスを構成する機能があります

    openDevice() {
    if(wiState != wisClosed)
      return;

    const samplerate = 44100;
    tWAVEFORMATEX format;
    format.wFormatTag = WAVE_FORMAT_PCM;
    format.nChannels = 1;
    format.nSamplesPerSec = samplerate;
    format.wBitsPerSample = 8;
    format.nBlockAlign = (format.nChannels * format.wBitsPerSample) / 8;
    format.nAvgBytesPerSec = (format.wBitsPerSample / 8) * samplerate;
    format.cbSize = 0;

5)関数がデータ「AudioIn :: onMessage」を取得するスレッドを開始しました

4

0 に答える 0