Problem mit LPVOID
-
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
-
Deine Daten stückchenweise aufnehmen - offenbar ist der verfügbare Puffer nicht groß genug, um die 4 Minuten Musik an einem Stück unterzubringen.
-
Jo das kann gut sein... Also auf jeden Fall vielen Dank an alle die mir weitergeholfen haben!!!
MFG
Hansi
-
Hallo! Hab en problem. Wie stell ich das denn am geschicktesten an mit dem stückchenweise aufnehmen? Hab echt keine ahnung.
MFG
Hansi