Frequenzen erkennen



  • Sieht eher so aus als ob WaveData nicht initialisiert ist...
    Wann genau sieht das denn so aus?
    Bevor die Struktur befüllt wird oder hinterher?



  • Das ist mein Sourcecode vielleicht hilft der ja das Problem zu lösen.

    VOID GetAudioData()
    {
    #define CHK(mmr) if(mmr!=MMSYSERR_NOERROR){MessageBox(0,"Fehler",0,0);}
    
    	HWAVEIN			hWaveIn;
    	MMRESULT		mmR;
    	WAVEFORMATEX	lpWaveFormatEx;
    	WAVEHDR			lpWaveHeader;
    	char			pBuff[512];
    	int				i=0;
    
    	lpWaveFormatEx.wFormatTag     =1; 
    	lpWaveFormatEx.nChannels      =1; 
    	lpWaveFormatEx.nSamplesPerSec =11025;
    	lpWaveFormatEx.nAvgBytesPerSec=11025; 
    	lpWaveFormatEx.nBlockAlign     =1; 
    	lpWaveFormatEx.wBitsPerSample  =8;
    
    	lpWaveHeader.lpData        =&pBuff[0]; 
    	lpWaveHeader.dwBufferLength=512;
    	lpWaveHeader.dwFlags	   =0L;
    	lpWaveHeader.dwLoops	   =0L;
    
    	mmR=waveInOpen(&hWaveIn,0,&lpWaveFormatEx,0,0,0);
    	CHK(mmR);
    
    	mmR=waveInStart(hWaveIn); 
    	CHK(mmR);
    
    	mmR=waveInPrepareHeader(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR));
    	CHK(mmR);
    
    	while (i<1000) //nicht sehr sinnvoll aber praktisch (Testschleife)
    	{ 
    		waveInAddBuffer(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR));
    		i++;
    		pBuff; //Stelle für Schnellüberwachung
    	} 
    
    	waveInUnprepareHeader(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR)); 
    	waveInReset(hWaveIn); 
    	waveInClose(hWaveIn);
    }
    


  • pBuff ist ja ein Array vom Typ char - deswegen versucht die Schnellüberwachung den Inhalt als Sting zu interpretieren 😉



  • Aber wie komme ich denn nun genau an diese Werte die in dem Array stehen ?
    Ich habe schon

    int wert=atoi(pBuff[0]);
    

    probiert aber da kommt eine unbehandelte Ausnahme.



  • Ich würde denken, dass du einfach casten kannst, also:

    int wert = (int)pBuff[0];
    

    Wenn du den Wert unbedingt in einem Int haben musst - eigentlich kannst du ja auch direkt mit pBuff[0] arbeiten (ist ja auch schon eine Zahl)



  • Jetzt habe ich nur noch ein Problem und zwar: in dem Array stehen keine Zahlen von 0-256 sonder sehr große und sehr kleine auch negative Zahlen.



  • erst nach dem casten? und wenn du Zahlen zw. 0 und 255 willst solltest du für pBuff unsigned char verwenden 🙂



  • Wenn ich mit Hilfe einer Timernachricht alle 25 oder 50 ms den Puffer fülle gibt es immer eine kleine Unterbrechung des Sound wie kann ich das denn verhindern ? Ich mal irgendwas mit einem Thread gesehen weiß aber nicht wie genau ich das anstellen muss das es auch wirklich funktioniert.



  • Hallo ! Wenn ich mir den Puffer so füllen lasse dann höre ich gar nichts mehr !
    Was ist ist denn da nur falsch ? Ich werde bald verrückt.

    #define SAMPLERATE 44100
    
    VOID PrepareAnalyzer()
    {
    	MMRESULT mmR;
    
    	lpWaveFormatEx.cbSize         =0;
    	lpWaveFormatEx.nAvgBytesPerSec=SAMPLERATE*2;
    	lpWaveFormatEx.nBlockAlign    =2;
    	lpWaveFormatEx.nChannels	  =1;
    	lpWaveFormatEx.nSamplesPerSec =SAMPLERATE;
    	lpWaveFormatEx.wBitsPerSample =16;
    	lpWaveFormatEx.wFormatTag     =WAVE_FORMAT_PCM;
    
    	mmR=waveInOpen(&hWaveIn,WAVE_MAPPER,&lpWaveFormatEx,(DWORD)g_hWnd,0L,CALLBACK_WINDOW);
    	CHECK_MMR(mmR);
    
    	lpWaveHdr.dwBufferLength=WAVEDATA;
    	lpWaveHdr.dwBytesRecorded=0;
    	lpWaveHdr.dwFlags=0L;
    	lpWaveHdr.dwLoops=0L;
    	lpWaveHdr.dwUser=0L;
    	lpWaveHdr.lpData=(LPSTR)chWaveData;
    
    	mmR=waveInPrepareHeader(hWaveIn,&lpWaveHdr,sizeof(WAVEHDR));
    	CHECK_MMR(mmR);
    
    	mmR=waveInAddBuffer(hWaveIn,&lpWaveHdr,sizeof(WAVEHDR));
    	CHECK_MMR(mmR);
    }
    
    VOID GetAudioData()
    {
    	MMRESULT mmR;
    
    	mmR=waveInStart(hWaveIn);
    	CHECK_MMR(mmR);
    }
    
    VOID CloseAnalyzer()
    {
    	if(hWaveIn!=NULL)
    	{
            waveInUnprepareHeader(hWaveIn,&lpWaveHdr,sizeof(WAVEHDR));
    		waveInReset(hWaveIn);
    		waveInClose(hWaveIn);
    	}
    }
    
    LRESULT CALLBACK WindowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	switch(msg)
    	{
    	case WM_COMMAND:
    		{
    			switch(LOWORD(wParam))
    			{
    			case BTN_GETAUDIODATA:
    				{
    					GetAudioData();
    					return 0;
    				}
                                    return 0;
                            }
    		}
    	case WM_DESTROY:
    		{
    			CloseAnalyzer();
    
    			return 0;
    		}
    	case MM_WIM_DATA:
    		{
    			waveInAddBuffer(hWaveIn,&lpWaveHdr,sizeof(WAVEHDR));
    
    			return 0;
    		}
    	}
    
    	return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    


  • Kommen die Nachrichten denn an? Und sind hWaveIn und lpWaveHdr dort gültig?



  • Ja ich komme an den Puffer ran es ist auch alles gültig nur der Sound kommt nicht.


Anmelden zum Antworten