Mehrere Sounds gleichzeitig abspielen
-
Wie kann ich mehrere Sounds gleichzeitig abspielen lassen?
-
sndPlaySound() mit dem Flag SND_ASYNC sollte dir weiterhelfen.
-
Nein!
Wenn da mehrere abgespielt werden wird der andere automatisch unterbrochen
-
Hallo Jakel
Dann benutze doch DirectX für totale Sound-Kontrolle.
Sieht zwar im ersten Moment nach viel Arbeit aus aber wenn Du auf diesem Code aufbaust, ist es ganz einfach.
Auf dem Form befinden sich nur zwei TButton und du brauchst natürlich auch 2 Sounds. Die dsound.lib muss im "Borland\CBuilder5\Lib" - Verzeichnis sein.
Ggf. von "Borland\CBuilder5\Lib\PSDK\" rüber-kopieren !!!
Schaue dir mal besonders die Zeilen 115 und 116 an://--------------------------------------------------------------------------- #include <dsound.h> #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" #define DSBCAPS_CTRLDEFAULT (DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME) LPDIRECTSOUND dsound; LPDIRECTSOUNDBUFFER Wave[3]; // 3=Anzahl der Sounds HWND hWnd; TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void Play_WAV(int snr, unsigned long freq, long vol) { DWORD WaveStatus; Wave[snr]->GetStatus(&WaveStatus); Wave[snr]->Stop(); Wave[snr]->SetCurrentPosition(0); Wave[snr]->Play(0,0,0); Wave[snr]->SetFrequency(freq); Wave[snr]->SetVolume(vol); }//PLAYWAV void Error(char* message) { //a function to help me display errors and why MessageBox(hWnd,message,"Fehler!",MB_OK); exit(-1); } void InitDirectSound() { //get directsound interface if(DS_OK != DirectSoundCreate(NULL,&dsound,NULL)) Error("InitDirectSound DirectSoundCreate"); //setcooperativelevel of interface if(DS_OK != dsound->SetCooperativeLevel(hWnd,DSSCL_PRIORITY)) Error("InitDirectSound SetCooperativeLevel"); } void LoadDirectSound(LPDIRECTSOUNDBUFFER *buffer,char* filename) { //open a wav file HMMIO wavefile; wavefile = mmioOpen(filename,0,MMIO_READ|MMIO_ALLOCBUF); if(wavefile==NULL) Error("LoadDirectSound mmioOpen"); //find wave data MMCKINFO parent; memset(&parent,0,sizeof(MMCKINFO)); parent.fccType = mmioFOURCC('W','A','V','E'); mmioDescend(wavefile,&parent,0,MMIO_FINDRIFF); //find fmt data MMCKINFO child; memset(&child,0,sizeof(MMCKINFO)); child.fccType = mmioFOURCC('f','m','t',' '); mmioDescend(wavefile,&child,&parent,0); //read the format WAVEFORMATEX wavefmt; //******************************************* wavefmt.nSamplesPerSec=44100; wavefmt.nChannels=2; wavefmt.wBitsPerSample=16; wavefmt.nBlockAlign=4; //2*16/8 wavefmt.nAvgBytesPerSec=176400; //44100*4 //******************************************* mmioRead(wavefile,(char*)&wavefmt,sizeof(wavefmt)); if(wavefmt.wFormatTag != WAVE_FORMAT_PCM) Error("LoadDirectSound mmioRead"); //find the wave data chunk mmioAscend(wavefile,&child,0); child.ckid = mmioFOURCC('d','a','t','a'); mmioDescend(wavefile,&child,&parent,MMIO_FINDCHUNK); //create a directsound buffer to hold wave data DSBUFFERDESC bufdesc; memset(&bufdesc,0,sizeof(DSBUFFERDESC)); bufdesc.dwSize = sizeof(DSBUFFERDESC); bufdesc.dwFlags = DSBCAPS_CTRLDEFAULT; bufdesc.dwBufferBytes = child.cksize; bufdesc.lpwfxFormat = &wavefmt; if(DS_OK != (dsound->CreateSoundBuffer(&bufdesc,&(*buffer),NULL))) Error("LoadDirectSound CreateSoundBuffer"); //write wave data to directsound buffer you just created void *write1=0,*write2=0; unsigned long length1,length2; (*buffer)->Lock(0,child.cksize,&write1,&length1,&write2,&length2,0); if(write1>0) mmioRead(wavefile,(char*)write1,length1); if(write2>0) mmioRead(wavefile,(char*)write2,length2); (*buffer)->Unlock(write1,length1,write2,length2); //close the wavefile, don't need it anymore, it's in the directsound buffer now mmioClose(wavefile,0); } void Game_Init(void) { LoadDirectSound(&Wave[1],"MeinSound_01.wav"); LoadDirectSound(&Wave[2],"MeinSound_02.wav"); } void Speicher_freigeben(void) { Wave[1]->Release(); Wave[1]=NULL; Wave[2]->Release(); Wave[2]=NULL; // Wave[3]->Release(); // Wave[3]=NULL; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Play_WAV(1,10000,-100); //Frequenz(0 bis 100000),Volume(0 bis -10000) } void __fastcall TForm1::Button2Click(TObject *Sender) { Play_WAV(2,10000,-100); //Frequenz(0 bis 100000),Volume(0 bis -10000) } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { hWnd=Form1->Handle; InitDirectSound(); // DirectSound Initialisieren Game_Init(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Speicher_freigeben(); } //---------------------------------------------------------------------------Hiermit lassen sich auf jeden Fall mehrere (wieviele eigentlich?) Sounds parallel abspielen.
Hoffe das hilft.
Bis Bald...
wNw
-
Sorry, und natürlich bitte Zeilen 134 und 139 beachten.