From 445db2035f75570a6f215d9189ca4f447fb3f0ea Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Wed, 28 Mar 2007 02:09:28 +0000 Subject: [PATCH] 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 --- core/AmAdvancedAudio.cpp | 54 ++++++++++++++++++++++++++++++++++++++++ core/AmAdvancedAudio.h | 28 ++++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/core/AmAdvancedAudio.cpp b/core/AmAdvancedAudio.cpp index a9e5dda9..7cc87983 100644 --- a/core/AmAdvancedAudio.cpp +++ b/core/AmAdvancedAudio.cpp @@ -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; +} diff --git a/core/AmAdvancedAudio.h b/core/AmAdvancedAudio.h index baaedee7..78768736 100644 --- a/core/AmAdvancedAudio.h +++ b/core/AmAdvancedAudio.h @@ -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); };