Audio: Sound looping and stopping

This commit is contained in:
2016-08-28 20:25:39 +02:00
committed by Valeriano A.R
parent 3e603ddc1e
commit 670e1e86eb
4 changed files with 76 additions and 9 deletions

View File

@@ -43,6 +43,8 @@ struct TAudioChan {
unsigned char rightvol;
unsigned char leftvol;
int loop;
AudioChan next;
};
AudioChan _channels=NULL;
@@ -141,7 +143,11 @@ static void Audio_MixerCallback(void *ud,Uint8 *stream,int l){
if(chan_remain>len){
len_mix=len;
}else{
len_mix=chan_remain;
if(chan->loop){
len_mix=len;
}else{
len_mix=chan_remain;
}
chan->wave=NULL;
}
@@ -173,10 +179,21 @@ static void Audio_MixerCallback(void *ud,Uint8 *stream,int l){
// Next sample
ptr_out+=2;
ptr_wave++;
if(ptr_wave>=(((signed short *)wave->buffer)+(wave->len-1))){
ptr_wave=((signed short *)wave->buffer);
}else{
ptr_wave++;
}
}
chan->pos+=len_mix;
if(chan->wave==NULL && chan->loop==1){
chan->wave=wave;
while(chan->pos>wave->len){
chan->pos-=wave->len;
}
}
// Next channel
prevchan=chan;
chan=chan->next;
@@ -303,13 +320,14 @@ AudioSnd Audio_LoadSound(char *filename){
// Audio_PlaySound
//
// Loads a sound, giving a reference.
void Audio_PlaySound(AudioSnd snd,
float leftvol, float rightvol)
AudioChn Audio_PlaySound(AudioSnd snd,
float leftvol, float rightvol,int loop)
{
AudioChan chan;
AudioWave wave;
if(!snd)
return;
if(!snd){
return(NULL);
}
// Cast AudioSnd to AudioWave
wave=snd;
@@ -329,7 +347,25 @@ void Audio_PlaySound(AudioSnd snd,
chan->pos=0;
chan->rightvol=(rightvol*255);
chan->leftvol=(leftvol*255);
chan->loop=loop;
// Include in sounds list
chan->next=_channels;
_channels=chan;
return chan;
}
/////////////////////////////
// Audio_StopChan
//
// Stops an audio chanel
void Audio_StopChan(AudioChn c){
AudioChan chan;
chan=c;
if(c==NULL){return;}
chan->loop=0;
chan->wave=NULL;
}

View File

@@ -25,6 +25,13 @@ void Audio_Frame();
typedef void *AudioSnd;
////////////////////////////////////////////////
// AudioChn //
//////////////
// Reference to a playing sound.
typedef void *AudioChn;
/////////////////////////////
// Audio_LoadSound
//
@@ -36,8 +43,15 @@ AudioSnd Audio_LoadSound(char *filename);
// Audio_PlaySound
//
// Loads a sound, giving a reference.
void Audio_PlaySound(AudioSnd snd,
float leftvol, float rightvol);
AudioChn Audio_PlaySound(AudioSnd snd,
float leftvol, float rightvol,int loop);
/////////////////////////////
// Audio_StopChan
//
// Stops an audio chanel
void Audio_StopChan(AudioChn chan);
#endif

View File

@@ -606,7 +606,17 @@ void GameLib_PlaySound(AudioSnd snd,int x,int y){
}
// PLAY!
Audio_PlaySound(snd,vleft,vright);
Audio_PlaySound(snd,vleft,vright,0);
}
/////////////////////////////
// GameLib_PlayLoopingSound
//
//
AudioChn GameLib_PlayLoopingSound(AudioSnd snd){
// PLAY!
return Audio_PlaySound(snd,1.0f,1.0f,1);
}

View File

@@ -108,6 +108,13 @@ int GameLib_EntityCustomCheckCollision(Entity ent,vec2 vel);
void GameLib_PlaySound(AudioSnd snd,int x,int y);
/////////////////////////////
// GameLib_PlayLoopingSound
//
// Play a sound looping
AudioChn GameLib_PlayLoopingSound(AudioSnd snd);
/////////////////////////////
// GameLib_EntitySetLight
//