Problem mit LPVOID
-
Hallo!
Ich arbeite zurzeit mit DirectSound.
Hier benutze ich die Funktion Lock um die Sampledaten auszulesen und memcpy um das ganze in eine int variable zu übertragen.lpCB->Lock(0, 206000*2, &b->SoundData1, &dwSoundDataSize1, &SoundData2, &dwSoundDataSize2, 0); memcpy(&a->Array, b->SoundData1, 2*206000);Ich hab jetz folgendes Problem: Wenn ich diesen Zahlenwert(206000*2) um 10 multipliziere gibt microsoft einen Problembericht aus, weil es dann nen Stack-Overflow gibt. Ich habe mir schon überlegt b->SoundData als int zu definieren, aber das will der Compiler nich. Es muss also ein LPVOID sein. Allerdings funktioniert es mit so großen LPVOID's nicht. Gibts irgendne Möglichkeit den Dateientyp zu erweitern, oder das Problem anderweilig zu lösen?
Danke
Hansi
-
Hast du daran gedacht, daß dieser Wert doppelt in deinem Programmschnipselchen verwendet wird (einmal für Lock [was für einen Parametertyp erwartet die Funktion eigentlich?] und einmal für memcpy)? Da wäre es vermutlich günstiger zur Wartung, den Wert als (C)#define bzw. (C++)const mit einem Namen zu versehen.
-
Meinst du die Funktion http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/htm/idirectsoundcapturebuffer8lock.asp ?
Falls ja -> lesen!
-
Hallo! Danke! Also Die Funktion Lock klappt jetz. Hab einfach DSCBLOCK_ENTIREBUFFER als letzten Parameter gesetzt un zack hats funktoniert. Allerdings macht memcpy immer noch probleme... Wie kann ich das denn beheben?
MFG
Hansi
-
Ich hät vielleicht noch ne idee, kann man die Werte von LPVOID irgendwie auslesen, weil dann könnte man die irgendwie in int umwandeln... Geht das?
MFG
Hansi
-
Hansi schrieb:
kann man die Werte von LPVOID irgendwie auslesen, weil dann könnte man die irgendwie in int umwandeln... Geht das?
Ich weiß net so genau, was du jetzt machen willst

Willst du den Zahlenwert des Pointers (Adresse)
- oder den Inhalt des Speichers (aber das sind ja nicht nur 4 Byte - also einfach die ersten 4?!), auf den er zeigt?
-
Ja, ich hab eigentlich dran gedacht den zahlenwert auszulesen. Damit ich den dann irgendwie in ne int umwandeln kann, aber ich kann auch im notfall alle 4 Byte einzeln auslesen, falls irgendjemand weiß wies geht.
MFG
Hansi
-
Soviel klarer ist das jetzt auch nicht

Du kannst den LPVOID auch einfach in ein (int
casten... - über [i] (i = 0..n) solltest du dann auf die einzelnen Werte zugreifen können 
-
Ja, ich will diesen int wert der da gespeichert is ablesen.
Allerdings funktioniert das so nicht:Array[1]=(int*)SoundData1[1];Der Kopiler sagt irgendwas, das ja die Größe von LPVOID unbekannt wär.
Was is denn da falsch?MFG
Hansi
-
Also jetzt mal langsam und der Reihe nach. Hast du deinen Code jetzt ungefähr so?
BYTE *pAudioData1; BYTE *pAudioData2; DWORD size_AudioData1, size_AudioData2; lpCB->Lock(0, 0, &pAudioData1, &size_AudioData1, &AudioData2, &size_AudioData2, DSCBLOCK_ENTIREBUFFER); BYTE *pMyCopyOfTheBuffer = new BYTE[size_AudioData1]; memcpy(pMyCopyOfTheBuffer, pAudioData1, size_AudioData1); //... delete[] pMyCopyOfTheBuffer;Ja? Gut. Was willst du da jetzt machen, bzw. welcher Wert von welcher Variable interessiert dich?
Oder welchen Fehler (Runtime oder Compiler) kriegst du und in welcher Zeile?
-
Ja im eigentlich schon ich hab nur als ersten Parameter nen Array.
int *Array=new int[20600000]; memcpy(Array,SoundData1,20600000)und jetzt will ich halt jedem einzelnen von diesen 20600000 int Variablen den Wert zuweisen der an der Stelle bei LPVOID steht.
MFGHansi
-
Niemand ne idee?
MFG
Hansi
-
Puh, nicht gerade leicht dir zu helfen.
Könntest du vieleicht mal sagen, wie die entsprechende Variable in meinem Code heißt, die du ändern willst, denn da gibt es keine Variable vom Typ LPVOID.
Alternativ könntest du auch noch mal deinen Code posten und die Variable darin nennen.
-
Also so sieht mein Code aus:
int *Array=new int[20600000]; LPVOID SoundData1; DWORD dwSoundDataSize1; LPVOID SoundData2; DWORD dwSoundDataSize2; lpCB->Lock(0, 20600000, &SoundData1, &dwSoundDataSize1, &SoundData2, &dwSoundDataSize2, DSCBLOCK_ENTIREBUFFER); memcpy(Array, &SoundData1, 20600000); lpCB->Unlock(SoundData1, dwSoundDataSize1, SoundData2, dwSoundDataSize2);Aber so funktioniert er nicht. Ich will einfach nur die int-Werte die in SoundData liegen in Array kopieren.
MFG
Hansi
-
"es funktioniert nicht" ist keine ausreichende Fehlermeldung

Eventuell könnte dein Problem darin liegen, daß int ein gutes Stück größer ist als ein Byte (und memcpy() arbeitet ganz sicher mit Speichergrößen in Byte, Lock() vermutlich auch).
-
[anhang zu cstoll]
und lpCB gibt auch die grösse des speicherblockes zurück.wenn dann so irgendwie, keinerlei garantie auf funktionalität
nur geratenlpCB->Lock(0, 20600000, &SoundData1, &dwSoundDataSize1, &SoundData2, &dwSoundDataSize2, DSCBLOCK_ENTIREBUFFER); char *Array=new char[dwSoundDataSize1]; memcpy(Array, SoundData1, dwSoundDataSize1); lpCB->Unlock(SoundData1, dwSoundDataSize1, SoundData2, dwSoundDataSize2);
-
Aha, so langsam verstehe ich.
SoundData hast du als LPVOID deklariert. Aber warum? Es kommen doch BYTES rein. Weil Lock einen LPVOID erwartet? Nunja, es erwartet einen Zeiger auf irgendwas und das drückt man mit LPVOID aus. Mit LPVOID kannst du aber nicht direkt auf die Daten zugreifen, weil keine Information bekannt ist, auf welchen Datentyp sich der Zeiger bezieht. Da würde ein einfacher Typecast helfen. Aber deklarier SoundData lieber als BYTE* (vgl. mein Code) und typecaste es im Funktionsaufruf zu LPVOID(, wenn es nicht ohne geht).Und dann natürlich das, was miller_m schreibt (vgl. mein Code). Vergiss die 20600000, die brauchst du nicht mehr. Du liest den ganzen Buffer aus (DSCBLOCK_ENTIREBUFFER) und bekommst in dwSoundDataSize1 gesagt wieviel Bytes es sind.
-
Also ich hab das jetz so umgeändert:
BYTE *pAudioData1; lpCB->Lock(0, 0,(LPVOID*) pAudioData1, &dwSoundDataSize1, &SoundData2, &dwSoundDataSize2, DSCBLOCK_ENTIREBUFFER); memcpy(a->Array, pAudioData1, 20600000);Aber es kommt trotzdem der Problembericht....
Was mach ich denn falsch?
MFG
Hansi
-
Was hast du nur immer mit deiner 20600000? (btw, wofür steht dieser Wert überhaupt?)
Die Lock()-Funktion gibt (nach der oben verlinkten Beschreibung) in den Parametern "&dwSoundDataSize1" und "&dwSoundDataSize2" die Größe des gerade reservierten Speicherbereichs zurück - wenn der kleiner ist als deine geheimnisvollen 20600000, kopierst du dir irgendwelche Mülldaten (oder noch schlimmer, du greifst auf Speicherbereiche zu, die physikalisch gar nicht existieren).
-
Die 20600000 stehn für die Länge, wie lang er aufnehmen soll, das sin so um die 3:50 min. Also ich hab alles versucht, aber es funktioniert nicht. Das is doch blöd... Wenn ich bei memcpy die Länge als dwSoundDataSize1 setze, nimmt er nur so um die 7 sek auf. danach bricht er ab, obwohl er auch noch danach aufnehmen sollte... Alles irgendwie komisch... Was kann ich denn noch ändern?
MFG
Hansi