rtphone/src/engine/media/MT_Box.cpp

133 lines
3.3 KiB
C++

/* Copyright(C) 2007-2017 VoIPobjects (voipobjects.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MT_Box.h"
#include "MT_AudioStream.h"
#include "MT_SrtpHelper.h"
#include "../helper/HL_VariantMap.h"
#include "../helper/HL_Exception.h"
#include "../helper/HL_StreamState.h"
#include "../helper/HL_Log.h"
#define LOG_SUBSYSTEM "MT::Box"
using namespace MT;
Terminal::Terminal(const CodecList::Settings& settings)
:mCodecList(settings)
{
ICELogDebug(<< "Opening Terminal instance");
// Alloc memory for captured audio
mCapturedAudio.setCapacity(AUDIO_MIC_BUFFER_COUNT * AUDIO_MIC_BUFFER_SIZE);
// Init srtp library
SrtpSession::initSrtp();
}
Terminal::~Terminal()
{
ICELogDebug(<< "Closing Terminal instance");
mAudioPair.reset();
}
PStream Terminal::createStream(int type, VariantMap& /*config*/)
{
PStream result;
switch (type)
{
case Stream::Audio:
result = PStream(new AudioStream(MT::CodecList::Settings::DefaultSettings));
mAudioList.add(result);
break;
case Stream::Video:
default:
throw Exception(ERR_NOT_IMPLEMENTED);
}
return result;
}
void Terminal::freeStream(const PStream& stream)
{
if (AudioStream* audio = dynamic_cast<AudioStream*>(stream.get()))
{
ICELogDebug(<< "Unregister audio stream from mixer.");
mAudioMixer.unregisterChannel(audio);
ICELogDebug(<< "Remove audio stream from list.");
mAudioList.remove(stream);
}
}
CodecList& Terminal::codeclist()
{
return mCodecList;
}
Audio::PDevicePair Terminal::audio()
{
return mAudioPair;
}
void Terminal::setAudio(const Audio::PDevicePair& audio)
{
mAudioPair = audio;
if (mAudioPair)
mAudioPair->setDelegate(this);
}
void Terminal::deviceChanged(Audio::DevicePair* dp)
{
}
void Terminal::onMicData(const Audio::Format& f, const void* buffer, int length)
{
//ICELogMedia(<< "Got " << length << " bytes from microphone");
// See if it is enough data to feed streams
mCapturedAudio.add(buffer, length);
if (mCapturedAudio.filled() < AUDIO_MIC_BUFFER_SIZE)
return;
StreamList sl;
mAudioList.copyTo(&sl);
// Iterate streams. See what of them requires microphone data.
for (int frameIndex=0; frameIndex < mCapturedAudio.filled() / AUDIO_MIC_BUFFER_SIZE; frameIndex++)
{
for (int i=0; i<sl.size(); i++)
{
if (AudioStream* stream = dynamic_cast<AudioStream*>(sl.streamAt(i).get()))
{
if (stream->state() & (int)StreamState::Sending)
stream->addData(mCapturedAudio.data(), AUDIO_MIC_BUFFER_SIZE);
}
}
mCapturedAudio.erase(AUDIO_MIC_BUFFER_SIZE);
}
}
void Terminal::onSpkData(const Audio::Format& f, void* buffer, int length)
{
ICELogMedia(<< "Speaker requests " << length << " bytes");
if (mAudioMixer.available() < length)
{
Lock l(mAudioList.getMutex());
for (int i=0; i<mAudioList.size(); i++)
{
if (AudioStream* stream = dynamic_cast<AudioStream*>(mAudioList.streamAt(i).get()))
{
//if (stream->state() & STATE_RECEIVING)
stream->copyDataTo(mAudioMixer, length - mAudioMixer.available());
}
}
}
mAudioMixer.getPcm(buffer, length);
}