waveInReset



  • hallo

    folgendes problem: ich will sowas aehnliches wie den MS AudioRecorder machen und hab mich da mit der audio-api bisschen rumgespielt.

    mal nen teil des sources:

    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
      buffer1 = new char[BUFFER_SIZE];
      buffer2 = new char[BUFFER_SIZE];
      buffer3 = new char[BUFFER_SIZE];
    
      waveFormat.wFormatTag       = WAVE_FORMAT_PCM;
      waveFormat.nChannels        = 1;
      waveFormat.nSamplesPerSec   = 11025;
      waveFormat.nAvgBytesPerSec  = 11025;
      waveFormat.nBlockAlign      = 1;
      waveFormat.wBitsPerSample   = 8;
      waveFormat.cbSize           = 0;
    
      waveHdr1.lpData          = buffer1;
      waveHdr1.dwBufferLength  = BUFFER_SIZE;
      waveHdr1.dwBytesRecorded = 0;
      waveHdr1.dwUser          = 0;
      waveHdr1.dwFlags         = 0;
      waveHdr1.dwLoops         = 1;
      waveHdr1.lpNext          = 0;
      waveHdr1.reserved        = 0;
    
      waveHdr2.lpData          = buffer2;
      waveHdr2.dwBufferLength  = BUFFER_SIZE;
      waveHdr2.dwBytesRecorded = 0;
      waveHdr2.dwUser          = 0;
      waveHdr2.dwFlags         = 0;
      waveHdr2.dwLoops         = 1;
      waveHdr2.lpNext          = 0;
      waveHdr2.reserved        = 0;
    
      stopRec = false;
      buf     = false;
    }
    //---------------------------------------------------------------------------
    
    void CALLBACK pWaveInProc(HWAVEIN hwin, UINT uMsg, DWORD Instance,
                              DWORD p1, DWORD p2)
    {
      switch(uMsg)
      {
        case WIM_OPEN:
        {
          ShowMes("waveIn geoeffnet");
          break;
        }
        case WIM_DATA:
        {
          if(stopRec==false) // stopRec fuer aufnahme abbruch
          {
            if(buf==false) // buf, variable fuer wahl des naechsten buffers
            {
              if(waveInAddBuffer(hwin,&waveHdr2,sizeof(WAVEHDR)))
                ShowMes("waveInAddBuffer waveHdr2 Error");
              else ShowMes("new Buffer2");
              buf=true;
            }
            else
            {
              if(waveInAddBuffer(hwin,&waveHdr1,sizeof(WAVEHDR)))
                ShowMes("waveInAddBuffer waveHdr1 Error");
              else ShowMes("new Buffer1");
              buf=false;
            }
          }
          else
          {
            ShowMes("waveInStop: "+IntToStr(waveInStop(hwin))); //(1)
            ShowMes("waveInReset: "+IntToStr(waveInReset(hwin))); //(2)
            waveInUnprepareHeader(hwin,&waveHdr1,sizeof(WAVEHDR));
            waveInUnprepareHeader(hwin,&waveHdr2,sizeof(WAVEHDR));
            ShowMes("Unprepare Header1 and Header2");
    
          }
          break;
        }
        case WIM_CLOSE:
        {
          ShowMes("waveIn geschlossen");
          break;
        }
      }
    }
    

    das teil arbeitet mit 2 buffern. das prob ist nun, das wenn ich die aufnahme abbreche, er mir noch bei (1) den fehlercode ausgibt (keinen fehler = 0), aber bei (2) gibt er mir nix mehr aus.
    hat jemand ne idee woran das liegen koennte ?

    Meep Meep



  • hallo

    hat sich mehr oder weniger erledigt.
    ich darf weder waveInReset noch waveInClose in der CALLBACK-funktion aufrufen.
    wenn ich die funktionsaufrufe ausserhalb der CALLBACK-funktion aufrufe, funkt es ganz normal. wuerd mich nur interessieren, warum das so is.

    vielleicht kann mir das ja jemand erklaeren.

    Meep Meep



  • wie ich sehe, hast du die wav-geschichte doch durchschaut 👍

    das man die device-function nicht in CB aufrufen darf, musst du dir in etwa so vorstellen. die CB wird vom treiber/os aufgerufen, wenn du da jetzt zwischenfunkst, indem du das dingen einfach zu machst - tja, wohin soll dann der return der CB gehen ? im worst-case gibts nen deadlock oder einen absturz.

    im MSDN wird auch extra darauf hingewiesen - gilt im übrigen auch für waveOut/midiIn/midiOut usw.


Anmelden zum Antworten