int DSoundInit() { DSBUFFERDESC dsbd; WAVEFORMATEX wfx; memset(&dsbd,0,sizeof(dsbd)); memset(&wfx,0,sizeof(wfx)); // Make wave format: wfx.wFormatTag=WAVE_FORMAT_PCM; wfx.nChannels=(unsigned short)((PicoOpt&8) ? 2 : 1); // Stereo/mono wfx.nSamplesPerSec=PsndRate; wfx.wBitsPerSample=16; wfx.nBlockAlign=(WORD)((wfx.nChannels*wfx.wBitsPerSample)>>3); wfx.nAvgBytesPerSec=wfx.nBlockAlign*wfx.nSamplesPerSec; // Make buffer for the next seg to put into the loop: DSoundNext=(short *)malloc(PsndLen<<2); if (DSoundNext==NULL) return 1; memset(DSoundNext,0,PsndLen<<2); // Create the DirectSound interface: DirectSoundCreate(NULL,&DSound,NULL); if (DSound==NULL) return 1; LoopLen=PsndLen<<1; // 2 segs #ifndef _XBOX LoopLen<<=1; // 4 segs DSound->SetCooperativeLevel(FrameWnd,DSSCL_PRIORITY); dsbd.dwFlags=DSBCAPS_GLOBALFOCUS; // Play in background #endif // Create the looping buffer: dsbd.dwSize=sizeof(dsbd); dsbd.dwBufferBytes=LoopLen<<wfx.nChannels; // 16bit stereo? dsbd.lpwfxFormat=&wfx; DSound->CreateSoundBuffer(&dsbd,&LoopBuffer,NULL); if (LoopBuffer==NULL) return 1; LoopBlank(); LoopBuffer->Play(0,0,DSBPLAY_LOOPING); return 0; }
int DSoundInit(HWND wnd_coop, int rate, int stereo, int seg_samples) { DSBUFFERDESC dsbd; WAVEFORMATEX wfx; DSBPOSITIONNOTIFY notifies[NSEGS]; int i; memset(&dsbd,0,sizeof(dsbd)); memset(&wfx,0,sizeof(wfx)); // Make wave format: wfx.wFormatTag=WAVE_FORMAT_PCM; wfx.nChannels=stereo ? 2 : 1; wfx.nSamplesPerSec=rate; wfx.wBitsPerSample=16; wfx.nBlockAlign=(WORD)((wfx.nChannels*wfx.wBitsPerSample)>>3); wfx.nAvgBytesPerSec=wfx.nBlockAlign*wfx.nSamplesPerSec; // Create the DirectSound interface: DirectSoundCreate(NULL,&DSound,NULL); if (DSound==NULL) return 1; LoopSeg = seg_samples * 2; if (stereo) LoopSeg *= 2; LoopLen = LoopSeg * NSEGS; DSound->SetCooperativeLevel(wnd_coop, DSSCL_PRIORITY); dsbd.dwFlags=DSBCAPS_GLOBALFOCUS; // Play in background dsbd.dwFlags|=DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLPOSITIONNOTIFY; // Create the looping buffer: dsbd.dwSize=sizeof(dsbd); dsbd.dwBufferBytes=LoopLen; dsbd.lpwfxFormat=&wfx; DSound->CreateSoundBuffer(&dsbd,&LoopBuffer,NULL); if (LoopBuffer==NULL) return 1; LoopBuffer->QueryInterface(IID_IDirectSoundNotify, (LPVOID*)&DSoundNotify); if (DSoundNotify == NULL) { lprintf("QueryInterface(IID_IDirectSoundNotify) failed\n"); goto out; } seg_played_event = CreateEvent(NULL, 0, 0, NULL); if (seg_played_event == NULL) goto out; for (i = 0; i < NSEGS; i++) { notifies[i].dwOffset = i * LoopSeg; notifies[i].hEventNotify = seg_played_event; } i = DSoundNotify->SetNotificationPositions(NSEGS, notifies); if (i != DS_OK) { lprintf("SetNotificationPositions failed\n"); goto out; } out: LoopBlank(); LoopBuffer->Play(0, 0, DSBPLAY_LOOPING); return 0; }