AmAudioFrontList AmAudio device, useful for e.g. fancier conferencing services

git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@285 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 20 years ago
parent 643a384516
commit 445db2035f

@ -226,3 +226,57 @@ int AmAudioDelay::read(unsigned int user_ts, unsigned int size) {
sarr.read((unsigned int) (user_ts - delay*8000.0), (short*) ((unsigned char*) samples), size >> 1);
return size;
}
AmAudioFrontlist::AmAudioFrontlist(AmEventQueue* q)
: AmPlaylist(q), back_audio(NULL)
{
}
AmAudioFrontlist::AmAudioFrontlist(AmEventQueue* q, AmAudio* back_audio)
: AmPlaylist(q), back_audio(back_audio)
{
}
AmAudioFrontlist::~AmAudioFrontlist() {
// ba_mut.lock();
// if (back_audio)
// back_audio->close();
// ba_mut.unlock();
}
void AmAudioFrontlist::setBackAudio(AmAudio* new_ba) {
ba_mut.lock();
back_audio = new_ba;
ba_mut.unlock();
}
int AmAudioFrontlist::put(unsigned int user_ts, unsigned char* buffer, unsigned int size) {
// stay consistent with Playlist - if empty return size
int res = size;
ba_mut.lock();
if (isEmpty()) {
if (back_audio)
res = back_audio->put(user_ts, buffer, size);
} else {
res = AmPlaylist::put(user_ts, buffer, size);
}
ba_mut.unlock();
return res;
}
int AmAudioFrontlist::get(unsigned int user_ts, unsigned char* buffer, unsigned int size) {
// stay consistent with Playlist - if empty return size
int res = size;
ba_mut.lock();
if (isEmpty()) {
if (back_audio)
res = back_audio->get(user_ts, buffer, size);
} else {
res = AmPlaylist::get(user_ts, buffer, size);
}
ba_mut.unlock();
return res;
}

@ -29,6 +29,8 @@
#define _AmAdvancedAudio_h_
#include "AmAudio.h"
#include "AmPlaylist.h"
#include "AmThread.h"
#include "amci/codecs.h"
@ -84,6 +86,31 @@ class AmAudioQueue : public AmAudio {
int read(unsigned int user_ts, unsigned int size);
};
/**
* AmAudioFrontlist is an AmAudio device, that has a playlist
* in front of a AmAudio entry, the 'back' device. The back device
* is only used if the playlist is empty. - This can be useful when
* for example announcements should be played to the participant
* while in a conference.
*
*/
class AmAudioFrontlist : public AmPlaylist {
AmMutex ba_mut;
AmAudio* back_audio;
public:
AmAudioFrontlist(AmEventQueue* q);
AmAudioFrontlist(AmEventQueue* q, AmAudio* back_audio);
~AmAudioFrontlist();
void setBackAudio(AmAudio* new_ba);
protected:
int put(unsigned int user_ts, unsigned char* buffer, unsigned int size);
int get(unsigned int user_ts, unsigned char* buffer, unsigned int size);
};
/**
* \brief \ref AmAudio that directly connects input and output
*
@ -111,7 +138,6 @@ class AmAudioDelay : public AmAudio {
AmAudioDelay(float delay_sec);
~AmAudioDelay();
protected:
int write(unsigned int user_ts, unsigned int size);
int read(unsigned int user_ts, unsigned int size);
};

Loading…
Cancel
Save