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