<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit WaveIn]]></title><description><![CDATA[<p>Ich will ein Osziloskop programmieren und das ganze funktioniert auch soweit ganz gut. Ich hol mir die Daten vom Mikrophon per WaveIn, komischerweise funktioniert dies Allerdings nicht richtig. Der Zeitliche Abstand zwischen 2 WM_DATA messages ist zu groß,müsste eigenltich ungefähr 33,3 ms betragen da ich mit 22050 Samples pro Sekunde aufnehme und ein Buffer 735 Samples groß ist. Außerdem kommt noch hinzu das die Buffer in einer nicht logischen Reihenfolge wieder an mein Programm zurückgegeben werden. Müsste ja eigenltich bei Double-Buffering 1.2.1.2.1.2... sein, sieht aber eher so aus 1.2.1.1.1.2.2.2.1.1.1.2.2.2.1.1.2.2..<br />
Die Routine die die Daten ausliest und den Buffer wieder in die Schlange hängt braucht allerdings nur 0.05 ms wobei sie eigentlich 33,3 ms Zeit hätte, daran kann es also auch nicht liegen. Eine vergrößerung / Verkleinerung des Buffers bringt auch keine Besserung, es dauert im Durchschnitt immer 10 ms länger bis eine Buffer-Full message eintrifft als es eigentlich der Fall sein dürfte.<br />
Der Umstieg von einer Callback-Funktion auf einen Callback-Thread hat leider auch keine Besserung gebracht.<br />
Das Programm könnt ihr euch anschauen unter<br />
<a href="http://stuff.benjamin-thaut.de/jf-cpp.zip" rel="nofollow">http://stuff.benjamin-thaut.de/jf-cpp.zip</a><br />
Mit F4 startet ihr die Aufnahme und mit F5 beendet ihr sie wieder, per ESC gehts aus dem Programm raus.</p>
<p>Ich Probier jetzt scho an die 10h an diesem Problem rum hab es auch schon mit 3 Buffern versucht und was weiß ich sonst noch was, bringt nichts. Wäre nett wenn ihr mir sagen könntet wo mein Fehler liegt.</p>
<p>Hier noch der Quellcode<br />
Soundin.h</p>
<pre><code class="language-cpp">#ifndef _SOUNDIN_H_
#define _SOUNDIN_H_

class soundin {
  public:    
    bool recording;
    bool init_done;
    char fault[256];
    int BufferSize; //Record @ 60 FPS
    int SampleRate;
    short int fps;
    short int *buffer1;//Buffer 1
    short int *buffer2;//Buffer 2
    short int *buffer3;//Buffer 3
    DWORD WINAPI (*CallbackFunc)(LPVOID arg);
    float LastDataBlock,CurrentDataBlock,DataBlockNormTime,TimeDifference;

    FILE *debugtxt;

    HWAVEIN      InputDevice;
    WAVEFORMATEX format;
    WAVEHDR      WaveInHdr1;
    WAVEHDR      WaveInHdr2;
    MMRESULT     result;
    DWORD       CallbackThread;

    unsigned short number_DataOutFuncs;
    std::vector&lt;BaseDataIn*&gt; DataOut;

    //Funktionen
    soundin(int BufferSizeIn,int SampleRateIn, short int fps);
    ~soundin();
    void AddSoundDataOut(BaseDataIn*);
    bool StartRecording();
    void StopRecording();
};

#endif
</code></pre>
<p>Soundin.cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;gl/gl.h&gt;
#include &lt;gl/glu.h&gt;
#include &lt;vector&gt;
#include &quot;waveview.h&quot;
#include &quot;thengine.h&quot;
#include &quot;soundin.h&quot;

extern renderer *render1;

DWORD WINAPI SoundInProc(LPVOID arg){
  MSG msg;
  float start,stop;
  short int *temp;
  unsigned short i,rest;
  soundin *klasse;
  FILE *debugtxt;
  WAVEHDR* data;
  while (GetMessage(&amp;msg, 0, 0, 0) == 1)
  {
      switch(msg.message){
        case MM_WIM_DATA:
          data = (WAVEHDR*) msg.lParam;
          if(data){
            klasse = (soundin*) data-&gt;dwUser;
            if(klasse){
              if(klasse-&gt;number_DataOutFuncs &gt; 0){
              klasse-&gt;CurrentDataBlock = render1-&gt;TimerGetTime();
              start = klasse-&gt;CurrentDataBlock;
              klasse-&gt;TimeDifference = klasse-&gt;CurrentDataBlock - klasse-&gt;LastDataBlock;
              //Daten aus der Struktur auslesen
              temp = new short int[klasse-&gt;BufferSize];
              for(i=0;i&lt;data-&gt;dwBytesRecorded/2;i++){
                temp[i] = data-&gt;lpData[i];
              }
              if(klasse-&gt;recording){ //Do we need to add headers?
                //Header leeren und wieder anhängen
                /*data-&gt;dwBufferLength = klasse-&gt;BufferSize*2;
                data-&gt;dwBytesRecorded=0;
                data-&gt;dwUser = 0L;
                data-&gt;dwFlags = 0L;
                data-&gt;dwLoops = 0L;
                klasse-&gt;result = waveInPrepareHeader(klasse-&gt;InputDevice, data, sizeof(WAVEHDR));
                if (klasse-&gt;result)
                {
                  waveInGetErrorText(klasse-&gt;result, klasse-&gt;fault, 256);
                  debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
                  fprintf(debugtxt,&quot;Error preparing Buffer on the run: %s\n&quot;,klasse-&gt;fault);
                  fprintf(debugtxt,&quot;BufferLength=%i,BufferSize=%i\n&quot;,data-&gt;dwBufferLength,data-&gt;dwBytesRecorded);
                  fclose(debugtxt);
                }*/
                klasse-&gt;result = waveInAddBuffer(klasse-&gt;InputDevice, data, sizeof(WAVEHDR));
                if (klasse-&gt;result)
                {
                  waveInGetErrorText(klasse-&gt;result, klasse-&gt;fault, 256);
                  debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
                  fprintf(debugtxt,&quot;Error Adding Buffer on the run: %s\n&quot;,klasse-&gt;fault);
                  fclose(debugtxt); 
                }
              }
              /*rest = data-&gt;dwBytesRecorded/2 - i;
              //restliche bytes null setzten
              for(i=rest;i&lt;data-&gt;dwBytesRecorded/2;i++){
                temp[i] = 0;
              }*/  
              //allen erwähnten DataOut Funnktionen die Daten übergeben                    
              for(i=0;i&lt;klasse-&gt;number_DataOutFuncs;i++){
                klasse-&gt;DataOut[i]-&gt;DataIn(temp);
              }
              //Speicher freigeben
              delete temp;
              stop = render1-&gt;TimerGetTime();
              debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
              fprintf(debugtxt,&quot;Buffer 0x%X in %.2f\n&quot;,msg.lParam,stop-start);
              if(klasse-&gt;TimeDifference &gt; klasse-&gt;DataBlockNormTime){
                fprintf(debugtxt,&quot;Critical Time between Buffers(%X): %.4f\n&quot;,msg.lParam,klasse-&gt;TimeDifference);
                fclose(debugtxt);
              }
              klasse-&gt;LastDataBlock = klasse-&gt;CurrentDataBlock;
            }
          }       
        }
        continue;
        case MM_WIM_CLOSE:
		  /* Terminate this thread (by return'ing) */
		  break;
      }
  }
  return(0);    
}

soundin::soundin(int BufferSizeIn,int SampleRateIn, short int fps){
    HANDLE TempHandle;
    debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
    fprintf(debugtxt,&quot;soundin(%i,%i,%i)\n&quot;,BufferSizeIn,SampleRateIn,fps);
    fclose(debugtxt);
    SampleRate = SampleRateIn;
    BufferSize = SampleRate / fps;
    DataBlockNormTime = 1000 / fps;
    format.wFormatTag=WAVE_FORMAT_PCM;     // simple, uncompressed format
    format.nChannels=1;                    //  1=mono, 2=stereo
    format.nSamplesPerSec=SampleRate;      // 44100
    format.nAvgBytesPerSec=SampleRate*2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
    format.nBlockAlign=2;                  // = n.Channels * wBitsPerSample/8
    format.wBitsPerSample=16;              //  16 for high quality, 8 for telephone-grade
    format.cbSize=0;

    //Set Callbackfunc
    CallbackFunc = SoundInProc;

   	TempHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CallbackFunc, 0, 0, &amp;CallbackThread);
	if (!TempHandle)
	{
		debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Can't create WAVE recording thread! -- %08X\n&quot;, GetLastError());
        fclose(debugtxt);
		init_done = false;
	}
	CloseHandle(TempHandle);

    //Create Our Buffers
    buffer1 = new short int[BufferSize];
    buffer2 = new short int[BufferSize];

    //Set Recording false
    recording = false;
    number_DataOutFuncs = 0;

    result = waveInOpen(&amp;InputDevice, WAVE_MAPPER ,&amp;format,
               (DWORD)CallbackThread, 0, CALLBACK_THREAD);

    if(result){
      waveInGetErrorText(result, fault, 256);
      debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
      fprintf(debugtxt,&quot;Error Opening Sound In: %s\n&quot;,fault);
      fclose(debugtxt);
      init_done = false;
    }
    else
      init_done = true;
     // Set up and prepare first header for input
     WaveInHdr1.lpData = (LPSTR)buffer1;
     WaveInHdr1.dwBufferLength = BufferSize*2;
     WaveInHdr1.dwBytesRecorded=0;
     WaveInHdr1.dwUser = (DWORD)this;
     WaveInHdr1.dwFlags = 0L;
     WaveInHdr1.dwLoops = 0L;
     result = waveInPrepareHeader(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error preparing Buffer 1: %s\n&quot;,fault);
       fprintf(debugtxt,&quot;BufferLength=%i,BufferSize=%i\n&quot;,WaveInHdr1.dwBufferLength,WaveInHdr1.dwBytesRecorded);
       fclose(debugtxt);
       recording=false;
       init_done=false; 
     }

     // Set up and prepare second header for input
     WaveInHdr2.lpData = (LPSTR)buffer2;
     WaveInHdr2.dwBufferLength = BufferSize*2;
     WaveInHdr2.dwBytesRecorded=0;
     WaveInHdr2.dwUser = (DWORD)this;
     WaveInHdr2.dwFlags = 0L;
     WaveInHdr2.dwLoops = 0L;
     result = waveInPrepareHeader(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error preparing Buffer 1: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       init_done = false; 
     }
}

soundin::~soundin(){
    if(recording &amp;&amp; init_done){
      recording=false;
      result = waveInReset(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error resetting SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }
    if(init_done){
      Sleep(100);
      waveInUnprepareHeader(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
      waveInUnprepareHeader(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
      result = waveInClose(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error closing SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }

    delete buffer1;
    delete buffer2;
}

bool soundin::StartRecording(){
    if(init_done &amp;&amp; !recording){
     recording = true;
     LastDataBlock=render1-&gt;TimerGetTime();

     // Insert Buffers
     //Buffer 1
     result = waveInAddBuffer(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Adding Buffer 1: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false; 
     }

     //Buffer 2
     result = waveInAddBuffer(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Adding Buffer 2: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false;
     }

     // Start Recording
     result = waveInStart(InputDevice);
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Start Recording: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false;
     }
     return true;
    }
    else
      return false;
}

void soundin::StopRecording(){
    if(recording &amp;&amp; init_done){
      recording = false;
      result = waveInReset(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error resetting SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }
}

void soundin::AddSoundDataOut(BaseDataIn* klasse){
     number_DataOutFuncs++;
     DataOut.push_back(klasse);
}
</code></pre>
<p>Bei dieser Version ensteht ab und zu ein Fehler beim Herunterfahren des Programms, allerdings ist das nicht mein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/140294/problem-mit-wavein</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 03:48:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/140294.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Mar 2006 18:12:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit WaveIn on Mon, 13 Mar 2006 18:12:57 GMT]]></title><description><![CDATA[<p>Ich will ein Osziloskop programmieren und das ganze funktioniert auch soweit ganz gut. Ich hol mir die Daten vom Mikrophon per WaveIn, komischerweise funktioniert dies Allerdings nicht richtig. Der Zeitliche Abstand zwischen 2 WM_DATA messages ist zu groß,müsste eigenltich ungefähr 33,3 ms betragen da ich mit 22050 Samples pro Sekunde aufnehme und ein Buffer 735 Samples groß ist. Außerdem kommt noch hinzu das die Buffer in einer nicht logischen Reihenfolge wieder an mein Programm zurückgegeben werden. Müsste ja eigenltich bei Double-Buffering 1.2.1.2.1.2... sein, sieht aber eher so aus 1.2.1.1.1.2.2.2.1.1.1.2.2.2.1.1.2.2..<br />
Die Routine die die Daten ausliest und den Buffer wieder in die Schlange hängt braucht allerdings nur 0.05 ms wobei sie eigentlich 33,3 ms Zeit hätte, daran kann es also auch nicht liegen. Eine vergrößerung / Verkleinerung des Buffers bringt auch keine Besserung, es dauert im Durchschnitt immer 10 ms länger bis eine Buffer-Full message eintrifft als es eigentlich der Fall sein dürfte.<br />
Der Umstieg von einer Callback-Funktion auf einen Callback-Thread hat leider auch keine Besserung gebracht.<br />
Das Programm könnt ihr euch anschauen unter<br />
<a href="http://stuff.benjamin-thaut.de/jf-cpp.zip" rel="nofollow">http://stuff.benjamin-thaut.de/jf-cpp.zip</a><br />
Mit F4 startet ihr die Aufnahme und mit F5 beendet ihr sie wieder, per ESC gehts aus dem Programm raus.</p>
<p>Ich Probier jetzt scho an die 10h an diesem Problem rum hab es auch schon mit 3 Buffern versucht und was weiß ich sonst noch was, bringt nichts. Wäre nett wenn ihr mir sagen könntet wo mein Fehler liegt.</p>
<p>Hier noch der Quellcode<br />
Soundin.h</p>
<pre><code class="language-cpp">#ifndef _SOUNDIN_H_
#define _SOUNDIN_H_

class soundin {
  public:    
    bool recording;
    bool init_done;
    char fault[256];
    int BufferSize; //Record @ 60 FPS
    int SampleRate;
    short int fps;
    short int *buffer1;//Buffer 1
    short int *buffer2;//Buffer 2
    short int *buffer3;//Buffer 3
    DWORD WINAPI (*CallbackFunc)(LPVOID arg);
    float LastDataBlock,CurrentDataBlock,DataBlockNormTime,TimeDifference;

    FILE *debugtxt;

    HWAVEIN      InputDevice;
    WAVEFORMATEX format;
    WAVEHDR      WaveInHdr1;
    WAVEHDR      WaveInHdr2;
    MMRESULT     result;
    DWORD       CallbackThread;

    unsigned short number_DataOutFuncs;
    std::vector&lt;BaseDataIn*&gt; DataOut;

    //Funktionen
    soundin(int BufferSizeIn,int SampleRateIn, short int fps);
    ~soundin();
    void AddSoundDataOut(BaseDataIn*);
    bool StartRecording();
    void StopRecording();
};

#endif
</code></pre>
<p>Soundin.cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;gl/gl.h&gt;
#include &lt;gl/glu.h&gt;
#include &lt;vector&gt;
#include &quot;waveview.h&quot;
#include &quot;thengine.h&quot;
#include &quot;soundin.h&quot;

extern renderer *render1;

DWORD WINAPI SoundInProc(LPVOID arg){
  MSG msg;
  float start,stop;
  short int *temp;
  unsigned short i,rest;
  soundin *klasse;
  FILE *debugtxt;
  WAVEHDR* data;
  while (GetMessage(&amp;msg, 0, 0, 0) == 1)
  {
      switch(msg.message){
        case MM_WIM_DATA:
          data = (WAVEHDR*) msg.lParam;
          if(data){
            klasse = (soundin*) data-&gt;dwUser;
            if(klasse){
              if(klasse-&gt;number_DataOutFuncs &gt; 0){
              klasse-&gt;CurrentDataBlock = render1-&gt;TimerGetTime();
              start = klasse-&gt;CurrentDataBlock;
              klasse-&gt;TimeDifference = klasse-&gt;CurrentDataBlock - klasse-&gt;LastDataBlock;
              //Daten aus der Struktur auslesen
              temp = new short int[klasse-&gt;BufferSize];
              for(i=0;i&lt;data-&gt;dwBytesRecorded/2;i++){
                temp[i] = data-&gt;lpData[i];
              }
              if(klasse-&gt;recording){ //Do we need to add headers?
                //Header leeren und wieder anhängen
                /*data-&gt;dwBufferLength = klasse-&gt;BufferSize*2;
                data-&gt;dwBytesRecorded=0;
                data-&gt;dwUser = 0L;
                data-&gt;dwFlags = 0L;
                data-&gt;dwLoops = 0L;
                klasse-&gt;result = waveInPrepareHeader(klasse-&gt;InputDevice, data, sizeof(WAVEHDR));
                if (klasse-&gt;result)
                {
                  waveInGetErrorText(klasse-&gt;result, klasse-&gt;fault, 256);
                  debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
                  fprintf(debugtxt,&quot;Error preparing Buffer on the run: %s\n&quot;,klasse-&gt;fault);
                  fprintf(debugtxt,&quot;BufferLength=%i,BufferSize=%i\n&quot;,data-&gt;dwBufferLength,data-&gt;dwBytesRecorded);
                  fclose(debugtxt);
                }*/
                klasse-&gt;result = waveInAddBuffer(klasse-&gt;InputDevice, data, sizeof(WAVEHDR));
                if (klasse-&gt;result)
                {
                  waveInGetErrorText(klasse-&gt;result, klasse-&gt;fault, 256);
                  debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
                  fprintf(debugtxt,&quot;Error Adding Buffer on the run: %s\n&quot;,klasse-&gt;fault);
                  fclose(debugtxt); 
                }
              }
              /*rest = data-&gt;dwBytesRecorded/2 - i;
              //restliche bytes null setzten
              for(i=rest;i&lt;data-&gt;dwBytesRecorded/2;i++){
                temp[i] = 0;
              }*/  
              //allen erwähnten DataOut Funnktionen die Daten übergeben                    
              for(i=0;i&lt;klasse-&gt;number_DataOutFuncs;i++){
                klasse-&gt;DataOut[i]-&gt;DataIn(temp);
              }
              //Speicher freigeben
              delete temp;
              stop = render1-&gt;TimerGetTime();
              debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
              fprintf(debugtxt,&quot;Buffer 0x%X in %.2f\n&quot;,msg.lParam,stop-start);
              if(klasse-&gt;TimeDifference &gt; klasse-&gt;DataBlockNormTime){
                fprintf(debugtxt,&quot;Critical Time between Buffers(%X): %.4f\n&quot;,msg.lParam,klasse-&gt;TimeDifference);
                fclose(debugtxt);
              }
              klasse-&gt;LastDataBlock = klasse-&gt;CurrentDataBlock;
            }
          }       
        }
        continue;
        case MM_WIM_CLOSE:
		  /* Terminate this thread (by return'ing) */
		  break;
      }
  }
  return(0);    
}

soundin::soundin(int BufferSizeIn,int SampleRateIn, short int fps){
    HANDLE TempHandle;
    debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
    fprintf(debugtxt,&quot;soundin(%i,%i,%i)\n&quot;,BufferSizeIn,SampleRateIn,fps);
    fclose(debugtxt);
    SampleRate = SampleRateIn;
    BufferSize = SampleRate / fps;
    DataBlockNormTime = 1000 / fps;
    format.wFormatTag=WAVE_FORMAT_PCM;     // simple, uncompressed format
    format.nChannels=1;                    //  1=mono, 2=stereo
    format.nSamplesPerSec=SampleRate;      // 44100
    format.nAvgBytesPerSec=SampleRate*2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
    format.nBlockAlign=2;                  // = n.Channels * wBitsPerSample/8
    format.wBitsPerSample=16;              //  16 for high quality, 8 for telephone-grade
    format.cbSize=0;

    //Set Callbackfunc
    CallbackFunc = SoundInProc;

   	TempHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CallbackFunc, 0, 0, &amp;CallbackThread);
	if (!TempHandle)
	{
		debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Can't create WAVE recording thread! -- %08X\n&quot;, GetLastError());
        fclose(debugtxt);
		init_done = false;
	}
	CloseHandle(TempHandle);

    //Create Our Buffers
    buffer1 = new short int[BufferSize];
    buffer2 = new short int[BufferSize];

    //Set Recording false
    recording = false;
    number_DataOutFuncs = 0;

    result = waveInOpen(&amp;InputDevice, WAVE_MAPPER ,&amp;format,
               (DWORD)CallbackThread, 0, CALLBACK_THREAD);

    if(result){
      waveInGetErrorText(result, fault, 256);
      debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
      fprintf(debugtxt,&quot;Error Opening Sound In: %s\n&quot;,fault);
      fclose(debugtxt);
      init_done = false;
    }
    else
      init_done = true;
     // Set up and prepare first header for input
     WaveInHdr1.lpData = (LPSTR)buffer1;
     WaveInHdr1.dwBufferLength = BufferSize*2;
     WaveInHdr1.dwBytesRecorded=0;
     WaveInHdr1.dwUser = (DWORD)this;
     WaveInHdr1.dwFlags = 0L;
     WaveInHdr1.dwLoops = 0L;
     result = waveInPrepareHeader(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error preparing Buffer 1: %s\n&quot;,fault);
       fprintf(debugtxt,&quot;BufferLength=%i,BufferSize=%i\n&quot;,WaveInHdr1.dwBufferLength,WaveInHdr1.dwBytesRecorded);
       fclose(debugtxt);
       recording=false;
       init_done=false; 
     }

     // Set up and prepare second header for input
     WaveInHdr2.lpData = (LPSTR)buffer2;
     WaveInHdr2.dwBufferLength = BufferSize*2;
     WaveInHdr2.dwBytesRecorded=0;
     WaveInHdr2.dwUser = (DWORD)this;
     WaveInHdr2.dwFlags = 0L;
     WaveInHdr2.dwLoops = 0L;
     result = waveInPrepareHeader(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error preparing Buffer 1: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       init_done = false; 
     }
}

soundin::~soundin(){
    if(recording &amp;&amp; init_done){
      recording=false;
      result = waveInReset(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error resetting SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }
    if(init_done){
      Sleep(100);
      waveInUnprepareHeader(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
      waveInUnprepareHeader(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
      result = waveInClose(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error closing SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }

    delete buffer1;
    delete buffer2;
}

bool soundin::StartRecording(){
    if(init_done &amp;&amp; !recording){
     recording = true;
     LastDataBlock=render1-&gt;TimerGetTime();

     // Insert Buffers
     //Buffer 1
     result = waveInAddBuffer(InputDevice, &amp;WaveInHdr1, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Adding Buffer 1: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false; 
     }

     //Buffer 2
     result = waveInAddBuffer(InputDevice, &amp;WaveInHdr2, sizeof(WAVEHDR));
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Adding Buffer 2: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false;
     }

     // Start Recording
     result = waveInStart(InputDevice);
     if (result)
     {
       waveInGetErrorText(result, fault, 256);
       debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
       fprintf(debugtxt,&quot;Error Start Recording: %s\n&quot;,fault);
       fclose(debugtxt);
       recording=false;
       return false;
     }
     return true;
    }
    else
      return false;
}

void soundin::StopRecording(){
    if(recording &amp;&amp; init_done){
      recording = false;
      result = waveInReset(InputDevice);
      if(result){
        waveInGetErrorText(result, fault, 256);
        debugtxt = fopen(&quot;debug.txt&quot;,&quot;a&quot;);
        fprintf(debugtxt,&quot;Error resetting SoundIn: %s\n&quot;,fault);
        fclose(debugtxt);
        init_done = false;
      }
    }
}

void soundin::AddSoundDataOut(BaseDataIn* klasse){
     number_DataOutFuncs++;
     DataOut.push_back(klasse);
}
</code></pre>
<p>Bei dieser Version ensteht ab und zu ein Fehler beim Herunterfahren des Programms, allerdings ist das nicht mein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1015600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1015600</guid><dc:creator><![CDATA[Ingrater]]></dc:creator><pubDate>Mon, 13 Mar 2006 18:12:57 GMT</pubDate></item></channel></rss>