dsm mod_conference: MixIn for mixing in files

sayer/1.4-spce2.6
Stefan Sayer 16 years ago
parent 2af18e6228
commit 9f88d0088d

@ -30,10 +30,12 @@
#include "AmPlaylist.h"
#include "AmConferenceChannel.h"
#include "AmRtpAudio.h"
#include "AmAudioMixIn.h"
#include "DSMSession.h"
#include "ModConference.h"
SC_EXPORT(MOD_CLS_NAME);
MOD_ACTIONEXPORT_BEGIN(MOD_CLS_NAME) {
@ -46,6 +48,9 @@ MOD_ACTIONEXPORT_BEGIN(MOD_CLS_NAME) {
DEF_CMD("conference.teejoin", ConfTeeJoinAction);
DEF_CMD("conference.teeleave", ConfTeeLeaveAction);
DEF_CMD("conference.setupMixIn", ConfSetupMixInAction);
DEF_CMD("conference.playMixIn", ConfPlayMixInAction);
} MOD_ACTIONEXPORT_END;
MOD_CONDITIONEXPORT_NONE(MOD_CLS_NAME);
@ -326,3 +331,71 @@ EXEC_ACTION_START(ConfTeeLeaveAction) {
sc_sess->CLR_ERRNO;
} EXEC_ACTION_END;
CONST_ACTION_2P(ConfSetupMixInAction, ',', true);
EXEC_ACTION_START(ConfSetupMixInAction) {
string level = resolveVars(par1, sess, sc_sess, event_params);
string seconds = resolveVars(par2, sess, sc_sess, event_params);
unsigned int s; double l; int flags = 0;
l = atof(level.c_str());
if (seconds.empty()) {
s = 0;
} else {
if (str2i(seconds, s)) {
throw DSMException("conference",
"cause", "could not interpret seconds value");
}
}
if (s == 0) {
flags = AUDIO_MIXIN_IMMEDIATE_START | AUDIO_MIXIN_ONCE;
}
AmAudio* output = sess->getOutput();
AmAudioMixIn* m = new AmAudioMixIn(output, NULL, s, l, flags);
sess->setOutput(m);
DSMDisposableT<AmAudioMixIn >* m_obj =
getDSMConfChannel<DSMDisposableT<AmAudioMixIn > >(sc_sess, CONF_AKEY_MIXER);
if (NULL != m_obj) {
DBG("releasing old MixIn (hope script write setInOutPlaylist before)\n");
m_obj->reset(m);
} else {
DBG("creating new mixer container\n");
m_obj = new DSMDisposableT<AmAudioMixIn >(m);
AmArg c_arg;
c_arg.setBorrowedPointer(m_obj);
sc_sess->avar[CONF_AKEY_MIXER] = c_arg;
// add to garbage collector
sc_sess->transferOwnership(m_obj);
}
} EXEC_ACTION_END;
EXEC_ACTION_START(ConfPlayMixInAction) {
string filename = resolveVars(arg, sess, sc_sess, event_params);
DSMDisposableT<AmAudioMixIn >* m_obj =
getDSMConfChannel<DSMDisposableT<AmAudioMixIn > >(sc_sess, CONF_AKEY_MIXER);
if (NULL == m_obj) {
throw DSMException("conference", "cause", "mixer not setup!\n");
}
AmAudioMixIn* m = m_obj->get();
DSMDisposableAudioFile* af = new DSMDisposableAudioFile();
if(af->open(filename,AmAudioFile::Read)) {
ERROR("audio file '%s' could not be opened for reading.\n",
filename.c_str());
delete af;
throw DSMException("file", "path", filename);
}
sc_sess->transferOwnership(af);
DBG("starting mixin of file '%s'\n", filename.c_str());
m->mixin(af);
} EXEC_ACTION_END;

@ -38,6 +38,7 @@ DECLARE_MODULE(MOD_CLS_NAME);
#define CONF_AKEY_CHANNEL "conf.chan"
#define CONF_AKEY_DEF_TEECHANNEL "conf.teechan"
#define CONF_AKEY_MIXER "conf.mixer"
/** holds a conference channel */
class DSMConfChannel
@ -68,6 +69,20 @@ class DSMTeeConfChannel
AmAudio* setupAudio(AmAudio* out);
};
template<class T> class DSMDisposableT
: public DSMDisposable,
public ArgObject {
std::auto_ptr<T> pobj;
public:
DSMDisposableT(T* _pobj) : pobj(_pobj) { }
~DSMDisposableT() { }
void release() { pobj.reset(NULL); }
void reset(T* _pobj) { pobj.reset(_pobj); }
T* get() { return pobj.get(); }
};
DEF_ACTION_2P(ConfJoinAction);
DEF_ACTION_1P(ConfLeaveAction);
DEF_ACTION_2P(ConfRejoinAction);
@ -76,4 +91,8 @@ DEF_ACTION_1P(ConfSetPlayoutTypeAction);
DEF_ACTION_2P(ConfTeeJoinAction);
DEF_ACTION_1P(ConfTeeLeaveAction);
DEF_ACTION_2P(ConfSetupMixInAction);
DEF_ACTION_1P(ConfPlayMixInAction);
#endif

@ -29,3 +29,19 @@ conference.teejoin(string roomname [, string avar_id])
conference.teeleave([string avar_id])
- leave tee conference (release conf channel)
- resets playlist as input and output
conference.setupMixIn(float level, unsigned int seconds)
- set up MixIn for mixing in files into output later
notes:
o only do that when playlist is input/output
(possibly do setInOutPlaylist first)
o in sessionStart event, set $connect_session=0, otherwise
playlist will be set as output again, and MixIn does not
play, e.g.
set($connect_session=0);
setInOutPlaylist();
conference.setupMixIn(0.5);
o if you use setupMixIn multiple times, use setInOutPlaylist first!!!!!
otherwise it could crash if old MixIn is still in the output /
the audio queue

Loading…
Cancel
Save