[C++] DirectSound streaming

Pagina: 1
Acties:
  • 64 views sinds 30-01-2008

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Voor een winamp output plugin heb ik het volgende stukje code. Ik wil gebruik maken van directsound om de pcm-wave-data die uit winamp komt naar de geluidskaart te sturen, dat moet niet overdreven moeilijk zijn zou je denken...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int write(char *buf, int len) // buf bevat raw audio data, die zo naar de geluidskaart mag, len is de langte van die data
{
    LPVOID ppvAudioPtr1; 
    LPDWORD pdwAudioBytes1 = NULL;
    LPVOID ppvAudioPtr2;
    LPDWORD pdwAudioBytes2 = NULL;
    DWORD dwOffset;
    
    writtentime += len; // niet relevant

    //priBuf is een LPDIRECTSOUNDBUFFER
    priBuf->GetCurrentPosition(NULL, &dwOffset); // zet de plaats waar we in de buffer mogen gaan schrijven in dwOffset
    
    priBuf->Lock(dwOffset, 256, &ppvAudioPtr1, pdwAudioBytes1, &ppvAudioPtr2, pdwAudioBytes2, NULL); // verkrijg de lock op de buffer
    
    memcpy(ppvAudioPtr1, &buf, (int)pdwAudioBytes1); // kopieer wat data naar de buffer

    MessageBox(out.hMainWindow, "debug message!", "ok", MB_OK); // deze krijg ik te zien
    Sleep(1000); // dit gaat ook nog goed
    priBuf->Unlock(ppvAudioPtr1, *pdwAudioBytes1, ppvAudioPtr2, 0); // op deze regel krijg ik een "winamp has encountered an error and needs to close" mededeling
    return 0;
}

Ik hoop dat het zo een beetje duidelijk is wat mijn bedoeling is en waar het fout gaat. Dat deze code niets doet met een deel van buf en dus eigenlijk functioneel gezien niet uitermate nuttig is moet je even niet op letten, dat kan ik als dit werkt namelijk wel aanpassen, maar ik wil eerst uberhaupt _iets_ in de buffer gestopt krijgen.

link naar msdn in ongeveer de juiste sectie:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/htm/_dx_idirectsoundbuffer8_play_dxaudio.asp

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Als ik die regel waar de fout optreed vervang door:
code:
1
priBuf->Unlock(&ppvAudioPtr1, *pdwAudioBytes1, &ppvAudioPtr2, 0); // op deze regel krijg ik een "winamp has encountered an error and needs to close" mededeling

merk ik geen verschil.

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Okee, dit lijkt nu goed te gaan...

Verwijderd

Mooi is dat die problemen die zichzelf oplossen *D

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Tja, er komt nog steeds geen enkel geluid uit...

En ik snap dus niet waarom niet want ik laat hem gewoon continu de inhoud van de buffer afspelen, dus als ik er ook maar iets instop zou je toch iets moeten horen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

overigens hoor je dingen als Sleep en MessageBox (of andere GUI dingen) niet tussen locks door te doen. DirectX 'freezed' het systeem (bindt me hier niet op vast overigens) zodat het zeker weet dat er niets fout kan gaan tijdens de lock, en in de documentatie staat ook dat de lock niet te lang moet duren (maw: locken, doe er snel wat mee, unlocken)

quote uit de MSDN:
After writing data to the pointers returned by this method*, the application must immediately call IDirectSoundBuffer8::Unlock to notify DirectSound that the data is ready for playback. Failure to do so can cause audio breakup or silence on some sound device configurations.

* IDirectSoundBuffer8::Lock ()
controleer trouwens eens op fouten... misschien gaat de hele lock wel niet goed :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Nikel
  • Registratie: Juli 2000
  • Niet online
Die sleep en messagebox had ik er al uit gehaald, maar evengoed geen geluid eruit. Ik heb echt geen idee waar dat door komt, ik doe ergens eerder in mn code:
code:
1
priBuf->Play(0, 0, DSBPLAY_LOOPING);

Een keer die aanroep zou voldoende moeten zijn om continu de buffer te blijven spelen. Dan lijkt het me dus dat het kopieren van de data niet goed gaat, wellicht gebruik ik memcpy verkeerd?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

controleer die Lock () functie nou eens op errors

.ot: zou je trouwens je SM topicje niet even editten? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Nikel
  • Registratie: Juli 2000
  • Niet online
Ik ontdek net dat het afspelen niet werkt, die geeft een fout terug, dom van mij natuurlijk, blijkt maar weer uit dat ik een c++ beginner ben...

  • Nikel
  • Registratie: Juli 2000
  • Niet online
.

  • Nikel
  • Registratie: Juli 2000
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (DirectSoundCreate(NULL, &soundcard, NULL) == DS_OK) //create direct sound object
    {
      //ok, DirectSound Object created, let's take control now...
      if (soundcard->SetCooperativeLevel(out.hMainWindow, DSSCL_WRITEPRIMARY) == DS_OK)
      {
            
            if (soundcard->CreateSoundBuffer(&priBufSet, &priBuf, NULL) != DS_OK)
            {
                MessageBox(out.hMainWindow, "createsoundbuffer mislukt!", "mooizo!", MB_OK);
                return -1;
            }
            
            priBuf->Stop();


            temp = priBuf->SetFormat(&waveFormat);
            if (temp == DSERR_INVALIDCALL)
            {
                MessageBox(out.hMainWindow, "Set primary buffer format didn't Work1!", "BAD!!", MB_OK);
                return -1;
            }

Die onderste messagebox verschijnt, en ik heb echt werkelijk geen flauw idee waar dat aan ligt.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

The SetFormat method sets the format of the primary buffer. Whenever this application has the input focus, DirectSound will set the primary buffer to the specified format.

Since primary sound buffers do not support the IDirectSoundBuffer8 interface, this method must be called on IDirectSoundBuffer
maar waarom doe je het trouwens niet gewoon met secondary buffers?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Kaj.
  • Registratie: Juni 1999
  • Niet online

Kaj.

1 LED is niet genoeg

Op slot op verzoek van de topicstarter
Pagina: 1

Dit topic is gesloten.