From fd530bad99d9a50d66fb40a61082c14ba648acea Mon Sep 17 00:00:00 2001 From: Marco Bascetta Date: Wed, 24 Jan 2018 09:25:20 +0100 Subject: [PATCH 17/23] voip/audiostream: play input file before activate capture card path. --- include/mediastreamer2/mediastream.h | 1 + src/voip/audiostream.c | 46 ++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/include/mediastreamer2/mediastream.h b/include/mediastreamer2/mediastream.h index 824fa053..4a94a434 100644 --- a/include/mediastreamer2/mediastream.h +++ b/include/mediastreamer2/mediastream.h @@ -394,6 +394,7 @@ struct _AudioStream int audiopin; int videopin; bool_t plumbed; + bool_t close_player; }av_player; MSFilter *flowcontrol; RtpSession *rtp_io_session; /**< The RTP session used for RTP input/output. */ diff --git a/src/voip/audiostream.c b/src/voip/audiostream.c index 569c85e1..41eec224 100644 --- a/src/voip/audiostream.c +++ b/src/voip/audiostream.c @@ -209,6 +209,15 @@ static void audio_stream_process_rtcp(MediaStream *media_stream, mblk_t *m){ } void audio_stream_iterate(AudioStream *stream){ + if( stream->av_player.close_player ) { + ms_warning("[%s:%d] Closing prepend file, enable microphone", __func__, __LINE__); + audio_stream_player_enable_path(stream, FALSE); + audio_stream_mic_enable_path(stream, TRUE); + audio_stream_set_mic_gain(stream, 1); + audio_stream_close_remote_play(stream); + stream->av_player.close_player = FALSE; + } + media_stream_iterate(&stream->ms); } @@ -522,7 +531,7 @@ static int open_av_player(AudioStream *stream, const char *filename){ MSPinFormat *videofmt=NULL; if (player->player) close_av_player(stream); - //player->player=_ms_create_av_player(filename); + player->close_player = FALSE; player->player=_ms_create_av_player(filename, stream->ms.factory); if (player->player==NULL){ ms_warning("AudioStream[%p]: no way to open [%s].",stream,filename); @@ -1351,6 +1360,24 @@ int audio_stream_start_from_io(AudioStream *stream, RtpProfile *profile, const c return 0; } +static void infile_play_finished_callback(void *userdata, struct _MSFilter *f __attribute__((unused)), unsigned int id, void *arg __attribute__((unused))) { + AudioStream *stream = (AudioStream*)userdata; + switch(id) { + case MS_PLAYER_EOF: + ms_warning("[%s:%d] File completed.", __func__, __LINE__); + stream->av_player.close_player = TRUE; + break; + + /* Ignore this. Is duplicate of MS_PLAYER_EOF */ + case MS_FILE_PLAYER_EOF: + break; + + default: + ms_warning("[%s:%d] Received unhandled id: %d", __func__, __LINE__, id); + break; + } +} + int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char *rem_rtp_ip,int rem_rtp_port, const char *rem_rtcp_ip, int rem_rtcp_port, int payload,int jitt_comp, const char *infile, const char *outfile, MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec){ @@ -1395,7 +1422,22 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char if (jitt_comp != -1) rtp_session_set_jitter_compensation(stream->ms.sessions.rtp_session, jitt_comp); audio_stream_enable_echo_canceller(stream, use_ec); - return audio_stream_start_from_io(stream, profile, rem_rtp_ip, rem_rtp_port, rem_rtcp_ip, rem_rtcp_port, payload, &io); + iR = audio_stream_start_from_io(stream, profile, rem_rtp_ip, rem_rtp_port, rem_rtcp_ip, rem_rtcp_port, payload, &io); + + if (prepend_file) { + MSFilter *player; + audio_stream_set_mic_gain(stream, 0); + audio_stream_mic_enable_path(stream, FALSE); + audio_stream_player_enable_path(stream, TRUE); + player = audio_stream_open_remote_play(stream, infile); + if (player){ + ms_warning("[%s:%d] Playing prepend file %s", __func__, __LINE__, infile); + ms_filter_call_method_noarg(player, MS_PLAYER_START); + ms_filter_add_notify_callback(player, infile_play_finished_callback, stream, TRUE); + } + } + + return iR; } int audio_stream_start_with_files(AudioStream *stream, RtpProfile *prof,const char *remip, int remport, -- 2.11.0