Problem mit LPVOID



  • "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 geraten

    lpCB->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



  • Kann man das mit nem thread machen?

    MFG

    Hansi



  • Kannst du machen, ich empfehle aber eine Schleife 😉

    while(daten vorhanden)
    {
      lpCB->Lock(0, 0, pData1, &dwSize1, pData2, &dwSize2, DSCBLOCK_ENTIREBUFFER);
      memcpy(a->Array,pData1,dwSize1);
      memcpy(a->Array+dwSize1,pData2,dwSize2);
      //verarbeite A->Array
      //fordere neue Daten an
    }
    


  • Ja aber dann wird doch auch irgendwann pData zu groß oder? Muss man das nich stoopen un dann wieder loslaufen lassen oder funktioniert das so, weil so in etwa hab ich das auch schonma probiert, allerdings war ich mir nicht sicher, ob das wirklich so geht...

    MFG

    Hansi


Anmelden zum Antworten