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.


Anmelden zum Antworten