Frequenzen erkennen



  • Hi!
    Also an die Daten zu kommen ist nichtmal so schwer.
    Mal grob ausgedrückt musst du folgendes machen:

    WaveInCaps WaveCaps;
    for(int i=0; i<waveInGetNumDevs()-1; i++)
    {
       result = waveInGetCaps(I,WaveCaps,48);
       cout "(" << i << ") " << WaveCaps.ProductName << "\n";
    }
    // dann den user auswählen lassen von 0 bis waveInGetNumDevs()-1
    // und das in Device abspeichern
    int DevHandle;
    WaveFormatEx WaveFMT;
    WaveFMT.FormatTag      = 1;
    WaveFMT.Channels       = 1;
    WaveFMT.SamplesPerSec  = 11025; // BlockAlign * SamplesPerSec
    WaveFMT.AvgBytesPerSec = 11025; // (Channels * BitsPerSample) / 8
    WaveFMT.BlockAlign     = 1;
    WaveFMT.BitsPerSample  = 8;
    WaveFMT.ExtraDataSize  = 0;
    
    waveInOpen(&DevHandle,Device,&WaveFMT,0,0,0);
    waveInStart(DevHandle);
    
    char WaveData[512];
    WaveHdr WaveHead;
    WaveHead.lpData         = &WaveData[0];
    WaveHead.dwBufferLength = 512;
    waveInPrepareHeader(DevHandle,&WaveHead,32);
    ...
    while !quit
    {
       ...
       waveInAddBuffer(DevHandle,&WaveHead,32);
       // nun steht im WaveData-Array die Amplitudenwerte (0 - 256)
       // die man jetzt noch grafisch darstellen könnte
       ....
    }
    ...
    waveInUnprepareHeader(DevHandle,&WaveHead,32);
    waveInReset(DevHandle);
    waveInClose(DevHandle);
    ...
    

    ich hoffe das nützt Dir was. Was mich selber interessieren würde,
    wie man z.B. aus diesen Werten eine simple ja/nein abfrage bauen könnte.

    mfg olli



  • Also erstmals Danke.
    Aber was macht:

    WaveFormatEx WaveFMT; 
    WaveFMT.FormatTag      = 1; 
    WaveFMT.Channels       = 1; 
    WaveFMT.SamplesPerSec  = 11025; // BlockAlign * SamplesPerSec 
    WaveFMT.AvgBytesPerSec = 11025; // (Channels * BitsPerSample) / 8 
    WaveFMT.BlockAlign     = 1; 
    WaveFMT.BitsPerSample  = 8; 
    WaveFMT.ExtraDataSize  = 0;
    

    😕



  • Und das hier:

    char WaveData[512]; 
    WaveHdr WaveHead; 
    WaveHead.lpData         = &WaveData[0]; 
    WaveHead.dwBufferLength = 512; 
    waveInPrepareHeader(DevHandle,&WaveHead,32);
    


  • Wie kann ich den LineIn-Eingang abfragen ???



  • Was willst du denn abfragen 😕 - Wie du die Daten davon einliest steht doch schon in diesem Thread 🙄



  • Ich wollt wissen ob ich was ich einstellen muss damit nur der Line-In abgehört wird und nicht das Mikro.



  • manuell, oder durch das Programm? Falls ersteres: das kannst du auswählen, wenn du einen Doppelklick auf den Lautsprecher im System-Tray machst und dann auf Aufnahme gehst 🙄



  • Sollte das Prog selber machen
    (sorry für die lange wartezeit)



  • Ich hoffe ihr könnt mir helfen:
    Ich hab den obigen Code ausprobiert und die Fehler behoben.
    Jetzt kommt aber beim Linken die Fehler Meldung:

    *-------------------Konfiguration: WaveIn - Win32 Debug--------------------
    Linker-Vorgang läuft...
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInClose@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInReset@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInUnprepareHeader@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInAddBuffer@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInPrepareHeader@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInStart@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInOpen@24
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInGetDevCapsA@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInGetNumDevs@0
    Debug/WaveIn.exe : fatal error LNK1120: 9 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    WaveIn.exe - 10 Fehler, 0 Warnung(en)*

    mmsystem.h und winmm.lib hab ich eingfügt.. an was kanns den noch liegen?



  • Kann es sein, dass du die lib nur in der Release-Version hinzugefügt hast?



  • Hallo !

    Wenn ich die Schnellüberwachung für WaveData einschalte stehen da nur Zahlen und Zeichen drin z.B. " -51 '€' ". Kann mir da jemand helfen oder ist das normal ?



  • Evtl. versucht die Schnellüberwachung einfach die Daten als ASCI-Zeichen zu interpretieren



  • 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.


Anmelden zum Antworten