Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Klasse die Wav-file einliest überarbeiten?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.06.2003, 15:02 Uhr
~Andrea Boeswett
Gast


Hallo,

bin noch frisch mit C++, verzeiht daher magelhafte Beschreibungen!?
Versuche gerade eine Klasse die Daten aus einem Wav-File in einen Buffer schiebt zu überarbeiten.
Ich wollte mich von dem Wav-File lösen und es flexibel auf LineIn und/oder Micro umbauen.

Bisherige Klasse:

bool StreamSource_Wave::getData(char* pBuf, unsigned lenBuf)
{
assert(pBuf);

if ((lenBuf + mReadOffset) <= mDataSize)
{
if (mmioRead(mhFile, (char*)pBuf, lenBuf) == -1)
{
mErrStr += "filling buffer with data\n";
return (false);
}
mReadOffset += lenBuf;
mDataCopied += lenBuf;
}
else// ((lenBuf + mReadOffset) > mDataSize) //wrap around
{
unsigned diff = mDataSize - mReadOffset;
if (mmioRead(mhFile, (char*)pBuf, diff) == -1)
{
mErrStr += "filling buffer with data\n";
return (false);
}
if (mmioSeek(mhFile, mDataOffset, SEEK_SET) == -1)
{
mErrStr += "Error seeking into wav file \n";
return (false);
}
mReadOffset = 0;
unsigned diff2 = lenBuf - diff;
if (mmioRead(mhFile, (char*)(pBuf+diff), diff2) == -1)
{
mErrStr += "filling buffer with data\n";
return (false);
}
mReadOffset = diff2;
mDataCopied += lenBuf;
}
return (true);
}

Diese wollte ich nun wie gesagt überarbeiten.
Nun meine Frage,
wie kann ich kurz und knapp auf LineIn und Micro zugreifen.
Dachte an:

WaveDevice(UINT nDevice = WAVE_MAPPER);

Allerdings weiß ich nicht welches angesprochen wird, LineIn oder Micro?
Weiterhin liegt ein Problem an, welches sich auf das kopieren der Daten in den Buffer betrifft.
Ganz grob ist die Reihenfolge doch so ähnlich:

// handle for input wave
HWAVEIN hwi;

// call CALLBACK_FUNCTION
waveInOpen(&hwi, m_waveDevice.GetDevice(), &wf,(DWORD)waveInProc,
NULL, CALLBACK_FUNCTION))

waveInPrepareHeader( hwi, &hdr, sizeof(WAVEHDR) )

waveInAddBuffer( hwi,&hdr,sizeof(hdr)

waveInStart(hwi)

waveInStop(hwi)

waveInUnprepareHeader(hwi, &hdr, sizeof(WAVEHDR));

waveInClose(hwi);


//Callbackfunction
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2)

Hier dann die weitere Frage, benötige ich alle Funktionen oder kann ich es eingrenzen?
Wie passe ich es grob an meine Klasse an?

Danke,

Gruß Andrea
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.06.2003, 15:31 Uhr
virtual
Sexiest Bit alive
(Operator)


Falsches Forum.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.06.2003, 15:36 Uhr
ao

(Operator)



Zitat:
~Andrea Boeswett postete
Allerdings weiß ich nicht welches angesprochen wird, LineIn oder Micro?



Ich hab das mal für waveOut gemacht und kann mich so dunkel erinnern, daß das Ganze in mehreren Stufen geht:

1. waveInGetNumDevs -> Number of devices abfragen.
2. waveInGetDevCaps -> Device Capabilities abfragen. Der Parameter uDeviceID kann von 0 bis NumberOfDevices-1 laufen und liefert jedesmal Info über ein Device, u.a. einen String mit einem Namen. Vielleicht steht da ja "LineInput" oder "Microphone" mit drin.


Zitat:
Weiterhin liegt ein Problem an, welches sich auf das kopieren der Daten in den Buffer betrifft. Ganz grob ist die Reihenfolge doch so ähnlich:
Hier dann die weitere Frage, benötige ich alle Funktionen oder kann ich es eingrenzen?
Wie passe ich es grob an meine Klasse an?



1. Der Ablauf für waveIn... stimmt so im Groben, würde ich sagen.

2. Ein prinzipieller Unterschied zwischen dem Lesen aus dem File, das du oben beschreibst und dem Lesen aus dem Audio-Device ist: das erste ist synchron (get_data rufen und mit den Daten zurückkehren), das zweite ist asynchron (Audiodevice konfigurieren und starten, ohne Daten zurückkehren; das Verschieben der Audiodaten in deinen Buffer geschieht im Hintergrund durch den Callback, ohne daß deine Applikation was dazutut.). Es ist nicht ganz einfach, diesen Unterschied zu berücksichtigen.

In der Callback-Funktion mußt du das machen, was bisher im "Hauptprogramm" nach der Rückkehr aus get_Data gemacht wurde. Das Umständlichste dabei ist, den Callback mit allen Rahmeninfos zu versorgen, damit er seinen Job erledigen kann. Tipp: Sourcecode-Debugger benutzen, um den Ablauf der Callback-Funktion zu verfolgen!

3. Es könnte eine gute Idee sein, waveInPrepareHeader und waveInAddBuffer mindestens zweimal zu machen; dadurch ist immer ein Block im Audiodevice und kann gefüllt werden, während der Callback die zuletzt geholten Daten in den Buffer schiebt. Machst du das nicht, dann stockt die Aufnahme während der Verarbeitung der alten Daten im Callback, weil kein Datenpuffer zur Verfügung steht.

Halt uns mal auf dem Laufenden.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.06.2003, 15:50 Uhr
~Andrea Boeswett
Gast


Hi,

Danke für die schnelle Antwort.
Werde es versuchen umzusetzen.

Sorry an den Administrator,
wegen dem falschen Eintrag!

gruß Andrea
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: