Index: voice_engine/channel.cc |
diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc |
index cc668f28946928f0121f68b5e85f211b7cb9021f..e5435d6bda52a8b556f265b971995d172b42931c 100644 |
--- a/voice_engine/channel.cc |
+++ b/voice_engine/channel.cc |
@@ -651,8 +651,6 @@ MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted( |
// Store speech type for dead-or-alive detection |
_outputSpeechType = audioFrame->speech_type_; |
- ChannelState::State state = channel_state_.Get(); |
- |
{ |
// Pass the audio buffers to an optional sink callback, before applying |
// scaling/panning, as that applies to the mix operation. |
@@ -680,21 +678,6 @@ MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted( |
AudioFrameOperations::ScaleWithSat(output_gain, audioFrame); |
} |
- // Mix decoded PCM output with file if file mixing is enabled |
- if (state.output_file_playing) { |
- MixAudioWithFile(*audioFrame, audioFrame->sample_rate_hz_); |
- muted = false; // We may have added non-zero samples. |
- } |
- |
- // Record playout if enabled |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (_outputFileRecording && output_file_recorder_) { |
- output_file_recorder_->RecordAudioToFile(*audioFrame); |
- } |
- } |
- |
// Measure audio level (0-9) |
// TODO(henrik.lundin) Use the |muted| information here too. |
// TODO(deadbeef): Use RmsLevel for |_outputAudioLevel| (see |
@@ -774,20 +757,7 @@ int32_t Channel::NeededFrequency(int32_t id) const { |
highestNeeded = receiveFrequency; |
} |
- // Special case, if we're playing a file on the playout side |
- // we take that frequency into consideration as well |
- // This is not needed on sending side, since the codec will |
- // limit the spectrum anyway. |
- if (channel_state_.Get().output_file_playing) { |
- rtc::CritScope cs(&_fileCritSect); |
- if (output_file_player_) { |
- if (output_file_player_->Frequency() > highestNeeded) { |
- highestNeeded = output_file_player_->Frequency(); |
- } |
- } |
- } |
- |
- return (highestNeeded); |
+ return highestNeeded; |
} |
int32_t Channel::CreateChannel(Channel*& channel, |
@@ -808,53 +778,6 @@ int32_t Channel::CreateChannel(Channel*& channel, |
return 0; |
} |
-void Channel::PlayNotification(int32_t id, uint32_t durationMs) { |
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::PlayNotification(id=%d, durationMs=%d)", id, |
- durationMs); |
- |
- // Not implement yet |
-} |
- |
-void Channel::RecordNotification(int32_t id, uint32_t durationMs) { |
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::RecordNotification(id=%d, durationMs=%d)", id, |
- durationMs); |
- |
- // Not implement yet |
-} |
- |
-void Channel::PlayFileEnded(int32_t id) { |
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::PlayFileEnded(id=%d)", id); |
- |
- if (id == _inputFilePlayerId) { |
- channel_state_.SetInputFilePlaying(false); |
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::PlayFileEnded() => input file player module is" |
- " shutdown"); |
- } else if (id == _outputFilePlayerId) { |
- channel_state_.SetOutputFilePlaying(false); |
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::PlayFileEnded() => output file player module is" |
- " shutdown"); |
- } |
-} |
- |
-void Channel::RecordFileEnded(int32_t id) { |
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::RecordFileEnded(id=%d)", id); |
- |
- assert(id == _outputFileRecorderId); |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- _outputFileRecording = false; |
- WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::RecordFileEnded() => output file recorder module is" |
- " shutdown"); |
-} |
- |
Channel::Channel(int32_t channelId, |
uint32_t instanceId, |
const VoEBase::ChannelConfig& config) |
@@ -874,12 +797,6 @@ Channel::Channel(int32_t channelId, |
telephone_event_handler_(rtp_receiver_->GetTelephoneEventHandler()), |
_outputAudioLevel(), |
_externalTransport(false), |
- // Avoid conflict with other channels by adding 1024 - 1026, |
- // won't use as much as 1024 channels. |
- _inputFilePlayerId(VoEModuleId(instanceId, channelId) + 1024), |
- _outputFilePlayerId(VoEModuleId(instanceId, channelId) + 1025), |
- _outputFileRecorderId(VoEModuleId(instanceId, channelId) + 1026), |
- _outputFileRecording(false), |
_timeStamp(0), // This is just an offset, RTP module will add it's own |
// random offset |
ntp_estimator_(Clock::GetRealTimeClock()), |
@@ -899,7 +816,6 @@ Channel::Channel(int32_t channelId, |
input_mute_(false), |
previous_frame_muted_(false), |
_outputGain(1.0f), |
- _mixFileWithMicrophone(false), |
_includeAudioLevelIndication(false), |
transport_overhead_per_packet_(0), |
rtp_overhead_per_packet_(0), |
@@ -1088,22 +1004,6 @@ void Channel::Terminate() { |
StopSend(); |
StopPlayout(); |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- if (input_file_player_) { |
- input_file_player_->RegisterModuleFileCallback(NULL); |
- input_file_player_->StopPlayingFile(); |
- } |
- if (output_file_player_) { |
- output_file_player_->RegisterModuleFileCallback(NULL); |
- output_file_player_->StopPlayingFile(); |
- } |
- if (output_file_recorder_) { |
- output_file_recorder_->RegisterModuleFileCallback(NULL); |
- output_file_recorder_->StopRecording(); |
- } |
- } |
- |
// The order to safely shutdown modules in a channel is: |
// 1. De-register callbacks in modules |
// 2. De-register modules in process thread |
@@ -1174,8 +1074,6 @@ int32_t Channel::StartPlayout() { |
} |
channel_state_.SetPlaying(true); |
- if (RegisterFilePlayingToMixer() != 0) |
- return -1; |
return 0; |
} |
@@ -1823,508 +1721,6 @@ int32_t Channel::ReceivedRTCPPacket(const uint8_t* data, size_t length) { |
return 0; |
} |
-int Channel::StartPlayingFileLocally(const char* fileName, |
- bool loop, |
- FileFormats format, |
- int startPosition, |
- float volumeScaling, |
- int stopPosition, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartPlayingFileLocally(fileNameUTF8[]=%s, loop=%d," |
- " format=%d, volumeScaling=%5.3f, startPosition=%d, " |
- "stopPosition=%d)", |
- fileName, loop, format, volumeScaling, startPosition, |
- stopPosition); |
- |
- if (channel_state_.Get().output_file_playing) { |
- _engineStatisticsPtr->SetLastError( |
- VE_ALREADY_PLAYING, kTraceError, |
- "StartPlayingFileLocally() is already playing"); |
- return -1; |
- } |
- |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (output_file_player_) { |
- output_file_player_->RegisterModuleFileCallback(NULL); |
- output_file_player_.reset(); |
- } |
- |
- output_file_player_ = FilePlayer::CreateFilePlayer( |
- _outputFilePlayerId, (const FileFormats)format); |
- |
- if (!output_file_player_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartPlayingFileLocally() filePlayer format is not correct"); |
- return -1; |
- } |
- |
- const uint32_t notificationTime(0); |
- |
- if (output_file_player_->StartPlayingFile( |
- fileName, loop, startPosition, volumeScaling, notificationTime, |
- stopPosition, (const CodecInst*)codecInst) != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_FILE, kTraceError, |
- "StartPlayingFile() failed to start file playout"); |
- output_file_player_->StopPlayingFile(); |
- output_file_player_.reset(); |
- return -1; |
- } |
- output_file_player_->RegisterModuleFileCallback(this); |
- channel_state_.SetOutputFilePlaying(true); |
- } |
- |
- if (RegisterFilePlayingToMixer() != 0) |
- return -1; |
- |
- return 0; |
-} |
- |
-int Channel::StartPlayingFileLocally(InStream* stream, |
- FileFormats format, |
- int startPosition, |
- float volumeScaling, |
- int stopPosition, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartPlayingFileLocally(format=%d," |
- " volumeScaling=%5.3f, startPosition=%d, stopPosition=%d)", |
- format, volumeScaling, startPosition, stopPosition); |
- |
- if (stream == NULL) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_FILE, kTraceError, |
- "StartPlayingFileLocally() NULL as input stream"); |
- return -1; |
- } |
- |
- if (channel_state_.Get().output_file_playing) { |
- _engineStatisticsPtr->SetLastError( |
- VE_ALREADY_PLAYING, kTraceError, |
- "StartPlayingFileLocally() is already playing"); |
- return -1; |
- } |
- |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- // Destroy the old instance |
- if (output_file_player_) { |
- output_file_player_->RegisterModuleFileCallback(NULL); |
- output_file_player_.reset(); |
- } |
- |
- // Create the instance |
- output_file_player_ = FilePlayer::CreateFilePlayer( |
- _outputFilePlayerId, (const FileFormats)format); |
- |
- if (!output_file_player_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartPlayingFileLocally() filePlayer format isnot correct"); |
- return -1; |
- } |
- |
- const uint32_t notificationTime(0); |
- |
- if (output_file_player_->StartPlayingFile(stream, startPosition, |
- volumeScaling, notificationTime, |
- stopPosition, codecInst) != 0) { |
- _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError, |
- "StartPlayingFile() failed to " |
- "start file playout"); |
- output_file_player_->StopPlayingFile(); |
- output_file_player_.reset(); |
- return -1; |
- } |
- output_file_player_->RegisterModuleFileCallback(this); |
- channel_state_.SetOutputFilePlaying(true); |
- } |
- |
- if (RegisterFilePlayingToMixer() != 0) |
- return -1; |
- |
- return 0; |
-} |
- |
-int Channel::StopPlayingFileLocally() { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StopPlayingFileLocally()"); |
- |
- if (!channel_state_.Get().output_file_playing) { |
- return 0; |
- } |
- |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (output_file_player_->StopPlayingFile() != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_STOP_RECORDING_FAILED, kTraceError, |
- "StopPlayingFile() could not stop playing"); |
- return -1; |
- } |
- output_file_player_->RegisterModuleFileCallback(NULL); |
- output_file_player_.reset(); |
- channel_state_.SetOutputFilePlaying(false); |
- } |
- // _fileCritSect cannot be taken while calling |
- // SetAnonymousMixibilityStatus. Refer to comments in |
- // StartPlayingFileLocally(const char* ...) for more details. |
- if (_outputMixerPtr->SetAnonymousMixabilityStatus(*this, false) != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError, |
- "StopPlayingFile() failed to stop participant from playing as" |
- "file in the mixer"); |
- return -1; |
- } |
- |
- return 0; |
-} |
- |
-int Channel::IsPlayingFileLocally() const { |
- return channel_state_.Get().output_file_playing; |
-} |
- |
-int Channel::RegisterFilePlayingToMixer() { |
- // Return success for not registering for file playing to mixer if: |
- // 1. playing file before playout is started on that channel. |
- // 2. starting playout without file playing on that channel. |
- if (!channel_state_.Get().playing || |
- !channel_state_.Get().output_file_playing) { |
- return 0; |
- } |
- |
- // |_fileCritSect| cannot be taken while calling |
- // SetAnonymousMixabilityStatus() since as soon as the participant is added |
- // frames can be pulled by the mixer. Since the frames are generated from |
- // the file, _fileCritSect will be taken. This would result in a deadlock. |
- if (_outputMixerPtr->SetAnonymousMixabilityStatus(*this, true) != 0) { |
- channel_state_.SetOutputFilePlaying(false); |
- rtc::CritScope cs(&_fileCritSect); |
- _engineStatisticsPtr->SetLastError( |
- VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError, |
- "StartPlayingFile() failed to add participant as file to mixer"); |
- output_file_player_->StopPlayingFile(); |
- output_file_player_.reset(); |
- return -1; |
- } |
- |
- return 0; |
-} |
- |
-int Channel::StartPlayingFileAsMicrophone(const char* fileName, |
- bool loop, |
- FileFormats format, |
- int startPosition, |
- float volumeScaling, |
- int stopPosition, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartPlayingFileAsMicrophone(fileNameUTF8[]=%s, " |
- "loop=%d, format=%d, volumeScaling=%5.3f, startPosition=%d, " |
- "stopPosition=%d)", |
- fileName, loop, format, volumeScaling, startPosition, |
- stopPosition); |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (channel_state_.Get().input_file_playing) { |
- _engineStatisticsPtr->SetLastError( |
- VE_ALREADY_PLAYING, kTraceWarning, |
- "StartPlayingFileAsMicrophone() filePlayer is playing"); |
- return 0; |
- } |
- |
- // Destroy the old instance |
- if (input_file_player_) { |
- input_file_player_->RegisterModuleFileCallback(NULL); |
- input_file_player_.reset(); |
- } |
- |
- // Create the instance |
- input_file_player_ = FilePlayer::CreateFilePlayer(_inputFilePlayerId, |
- (const FileFormats)format); |
- |
- if (!input_file_player_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartPlayingFileAsMicrophone() filePlayer format isnot correct"); |
- return -1; |
- } |
- |
- const uint32_t notificationTime(0); |
- |
- if (input_file_player_->StartPlayingFile( |
- fileName, loop, startPosition, volumeScaling, notificationTime, |
- stopPosition, (const CodecInst*)codecInst) != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_FILE, kTraceError, |
- "StartPlayingFile() failed to start file playout"); |
- input_file_player_->StopPlayingFile(); |
- input_file_player_.reset(); |
- return -1; |
- } |
- input_file_player_->RegisterModuleFileCallback(this); |
- channel_state_.SetInputFilePlaying(true); |
- |
- return 0; |
-} |
- |
-int Channel::StartPlayingFileAsMicrophone(InStream* stream, |
- FileFormats format, |
- int startPosition, |
- float volumeScaling, |
- int stopPosition, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartPlayingFileAsMicrophone(format=%d, " |
- "volumeScaling=%5.3f, startPosition=%d, stopPosition=%d)", |
- format, volumeScaling, startPosition, stopPosition); |
- |
- if (stream == NULL) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_FILE, kTraceError, |
- "StartPlayingFileAsMicrophone NULL as input stream"); |
- return -1; |
- } |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (channel_state_.Get().input_file_playing) { |
- _engineStatisticsPtr->SetLastError( |
- VE_ALREADY_PLAYING, kTraceWarning, |
- "StartPlayingFileAsMicrophone() is playing"); |
- return 0; |
- } |
- |
- // Destroy the old instance |
- if (input_file_player_) { |
- input_file_player_->RegisterModuleFileCallback(NULL); |
- input_file_player_.reset(); |
- } |
- |
- // Create the instance |
- input_file_player_ = FilePlayer::CreateFilePlayer(_inputFilePlayerId, |
- (const FileFormats)format); |
- |
- if (!input_file_player_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartPlayingInputFile() filePlayer format isnot correct"); |
- return -1; |
- } |
- |
- const uint32_t notificationTime(0); |
- |
- if (input_file_player_->StartPlayingFile(stream, startPosition, volumeScaling, |
- notificationTime, stopPosition, |
- codecInst) != 0) { |
- _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError, |
- "StartPlayingFile() failed to start " |
- "file playout"); |
- input_file_player_->StopPlayingFile(); |
- input_file_player_.reset(); |
- return -1; |
- } |
- |
- input_file_player_->RegisterModuleFileCallback(this); |
- channel_state_.SetInputFilePlaying(true); |
- |
- return 0; |
-} |
- |
-int Channel::StopPlayingFileAsMicrophone() { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StopPlayingFileAsMicrophone()"); |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (!channel_state_.Get().input_file_playing) { |
- return 0; |
- } |
- |
- if (input_file_player_->StopPlayingFile() != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_STOP_RECORDING_FAILED, kTraceError, |
- "StopPlayingFile() could not stop playing"); |
- return -1; |
- } |
- input_file_player_->RegisterModuleFileCallback(NULL); |
- input_file_player_.reset(); |
- channel_state_.SetInputFilePlaying(false); |
- |
- return 0; |
-} |
- |
-int Channel::IsPlayingFileAsMicrophone() const { |
- return channel_state_.Get().input_file_playing; |
-} |
- |
-int Channel::StartRecordingPlayout(const char* fileName, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartRecordingPlayout(fileName=%s)", fileName); |
- |
- if (_outputFileRecording) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1), |
- "StartRecordingPlayout() is already recording"); |
- return 0; |
- } |
- |
- FileFormats format; |
- const uint32_t notificationTime(0); // Not supported in VoE |
- CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000}; |
- |
- if ((codecInst != NULL) && |
- ((codecInst->channels < 1) || (codecInst->channels > 2))) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_ARGUMENT, kTraceError, |
- "StartRecordingPlayout() invalid compression"); |
- return (-1); |
- } |
- if (codecInst == NULL) { |
- format = kFileFormatPcm16kHzFile; |
- codecInst = &dummyCodec; |
- } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) || |
- (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) || |
- (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) { |
- format = kFileFormatWavFile; |
- } else { |
- format = kFileFormatCompressedFile; |
- } |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- // Destroy the old instance |
- if (output_file_recorder_) { |
- output_file_recorder_->RegisterModuleFileCallback(NULL); |
- output_file_recorder_.reset(); |
- } |
- |
- output_file_recorder_ = FileRecorder::CreateFileRecorder( |
- _outputFileRecorderId, (const FileFormats)format); |
- if (!output_file_recorder_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartRecordingPlayout() fileRecorder format isnot correct"); |
- return -1; |
- } |
- |
- if (output_file_recorder_->StartRecordingAudioFile( |
- fileName, (const CodecInst&)*codecInst, notificationTime) != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_FILE, kTraceError, |
- "StartRecordingAudioFile() failed to start file recording"); |
- output_file_recorder_->StopRecording(); |
- output_file_recorder_.reset(); |
- return -1; |
- } |
- output_file_recorder_->RegisterModuleFileCallback(this); |
- _outputFileRecording = true; |
- |
- return 0; |
-} |
- |
-int Channel::StartRecordingPlayout(OutStream* stream, |
- const CodecInst* codecInst) { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::StartRecordingPlayout()"); |
- |
- if (_outputFileRecording) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1), |
- "StartRecordingPlayout() is already recording"); |
- return 0; |
- } |
- |
- FileFormats format; |
- const uint32_t notificationTime(0); // Not supported in VoE |
- CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000}; |
- |
- if (codecInst != NULL && codecInst->channels != 1) { |
- _engineStatisticsPtr->SetLastError( |
- VE_BAD_ARGUMENT, kTraceError, |
- "StartRecordingPlayout() invalid compression"); |
- return (-1); |
- } |
- if (codecInst == NULL) { |
- format = kFileFormatPcm16kHzFile; |
- codecInst = &dummyCodec; |
- } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) || |
- (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) || |
- (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) { |
- format = kFileFormatWavFile; |
- } else { |
- format = kFileFormatCompressedFile; |
- } |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- // Destroy the old instance |
- if (output_file_recorder_) { |
- output_file_recorder_->RegisterModuleFileCallback(NULL); |
- output_file_recorder_.reset(); |
- } |
- |
- output_file_recorder_ = FileRecorder::CreateFileRecorder( |
- _outputFileRecorderId, (const FileFormats)format); |
- if (!output_file_recorder_) { |
- _engineStatisticsPtr->SetLastError( |
- VE_INVALID_ARGUMENT, kTraceError, |
- "StartRecordingPlayout() fileRecorder format isnot correct"); |
- return -1; |
- } |
- |
- if (output_file_recorder_->StartRecordingAudioFile(stream, *codecInst, |
- notificationTime) != 0) { |
- _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError, |
- "StartRecordingPlayout() failed to " |
- "start file recording"); |
- output_file_recorder_->StopRecording(); |
- output_file_recorder_.reset(); |
- return -1; |
- } |
- |
- output_file_recorder_->RegisterModuleFileCallback(this); |
- _outputFileRecording = true; |
- |
- return 0; |
-} |
- |
-int Channel::StopRecordingPlayout() { |
- WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1), |
- "Channel::StopRecordingPlayout()"); |
- |
- if (!_outputFileRecording) { |
- WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, -1), |
- "StopRecordingPlayout() isnot recording"); |
- return -1; |
- } |
- |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (output_file_recorder_->StopRecording() != 0) { |
- _engineStatisticsPtr->SetLastError( |
- VE_STOP_RECORDING_FAILED, kTraceError, |
- "StopRecording() could not stop recording"); |
- return (-1); |
- } |
- output_file_recorder_->RegisterModuleFileCallback(NULL); |
- output_file_recorder_.reset(); |
- _outputFileRecording = false; |
- |
- return 0; |
-} |
- |
-void Channel::SetMixWithMicStatus(bool mix) { |
- rtc::CritScope cs(&_fileCritSect); |
- _mixFileWithMicrophone = mix; |
-} |
- |
int Channel::GetSpeechOutputLevel() const { |
return _outputAudioLevel.Level(); |
} |
@@ -2760,10 +2156,6 @@ void Channel::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) { |
RTC_DCHECK_LE(audio_input->num_channels_, 2); |
RTC_DCHECK_EQ(audio_input->id_, ChannelId()); |
- if (channel_state_.Get().input_file_playing) { |
- MixOrReplaceAudioWithFile(audio_input); |
- } |
- |
bool is_muted = InputMute(); |
AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted); |
@@ -2903,96 +2295,6 @@ int Channel::GetRtpRtcp(RtpRtcp** rtpRtcpModule, |
return 0; |
} |
-// TODO(andrew): refactor Mix functions here and in transmit_mixer.cc to use |
-// a shared helper. |
-int32_t Channel::MixOrReplaceAudioWithFile(AudioFrame* audio_input) { |
- RTC_DCHECK_RUN_ON(encoder_queue_); |
- std::unique_ptr<int16_t[]> fileBuffer(new int16_t[640]); |
- size_t fileSamples(0); |
- const int mixingFrequency = audio_input->sample_rate_hz_; |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (!input_file_player_) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixOrReplaceAudioWithFile() fileplayer" |
- " doesnt exist"); |
- return -1; |
- } |
- |
- if (input_file_player_->Get10msAudioFromFile(fileBuffer.get(), &fileSamples, |
- mixingFrequency) == -1) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixOrReplaceAudioWithFile() file mixing " |
- "failed"); |
- return -1; |
- } |
- if (fileSamples == 0) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixOrReplaceAudioWithFile() file is ended"); |
- return 0; |
- } |
- } |
- |
- RTC_DCHECK_EQ(audio_input->samples_per_channel_, fileSamples); |
- |
- if (_mixFileWithMicrophone) { |
- // Currently file stream is always mono. |
- // TODO(xians): Change the code when FilePlayer supports real stereo. |
- MixWithSat(audio_input->mutable_data(), audio_input->num_channels_, |
- fileBuffer.get(), 1, fileSamples); |
- } else { |
- // Replace ACM audio with file. |
- // Currently file stream is always mono. |
- // TODO(xians): Change the code when FilePlayer supports real stereo. |
- audio_input->UpdateFrame( |
- _channelId, 0xFFFFFFFF, fileBuffer.get(), fileSamples, mixingFrequency, |
- AudioFrame::kNormalSpeech, AudioFrame::kVadUnknown, 1); |
- } |
- return 0; |
-} |
- |
-int32_t Channel::MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency) { |
- assert(mixingFrequency <= 48000); |
- |
- std::unique_ptr<int16_t[]> fileBuffer(new int16_t[960]); |
- size_t fileSamples(0); |
- |
- { |
- rtc::CritScope cs(&_fileCritSect); |
- |
- if (!output_file_player_) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixAudioWithFile() file mixing failed"); |
- return -1; |
- } |
- |
- // We should get the frequency we ask for. |
- if (output_file_player_->Get10msAudioFromFile( |
- fileBuffer.get(), &fileSamples, mixingFrequency) == -1) { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixAudioWithFile() file mixing failed"); |
- return -1; |
- } |
- } |
- |
- if (audioFrame.samples_per_channel_ == fileSamples) { |
- // Currently file stream is always mono. |
- // TODO(xians): Change the code when FilePlayer supports real stereo. |
- MixWithSat(audioFrame.mutable_data(), audioFrame.num_channels_, |
- fileBuffer.get(), 1, fileSamples); |
- } else { |
- WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
- "Channel::MixAudioWithFile() samples_per_channel_(%" PRIuS |
- ") != " |
- "fileSamples(%" PRIuS ")", |
- audioFrame.samples_per_channel_, fileSamples); |
- return -1; |
- } |
- |
- return 0; |
-} |
- |
void Channel::UpdatePlayoutTimestamp(bool rtcp) { |
jitter_buffer_playout_timestamp_ = audio_coding_->PlayoutTimestamp(); |