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.