- format source code (indentation 4 space
This commit is contained in:
@@ -15,181 +15,181 @@
|
||||
|
||||
|
||||
AudioManager::AudioManager()
|
||||
:mTerminal(nullptr), mAudioMonitoring(nullptr)
|
||||
:mTerminal(nullptr), mAudioMonitoring(nullptr)
|
||||
{
|
||||
mPlayer.setDelegate(this);
|
||||
mPlayer.setDelegate(this);
|
||||
}
|
||||
|
||||
AudioManager::~AudioManager()
|
||||
{
|
||||
// stop();
|
||||
// stop();
|
||||
}
|
||||
|
||||
AudioManager& AudioManager::instance()
|
||||
{
|
||||
static std::shared_ptr<AudioManager> GAudioManager;
|
||||
|
||||
if (!GAudioManager)
|
||||
GAudioManager = std::make_shared<AudioManager>();
|
||||
|
||||
return *GAudioManager;
|
||||
static std::shared_ptr<AudioManager> GAudioManager;
|
||||
|
||||
if (!GAudioManager)
|
||||
GAudioManager = std::make_shared<AudioManager>();
|
||||
|
||||
return *GAudioManager;
|
||||
}
|
||||
|
||||
void AudioManager::setTerminal(MT::Terminal* terminal)
|
||||
{
|
||||
mTerminal = terminal;
|
||||
mTerminal = terminal;
|
||||
}
|
||||
|
||||
MT::Terminal* AudioManager::terminal()
|
||||
{
|
||||
return mTerminal;
|
||||
return mTerminal;
|
||||
}
|
||||
|
||||
void AudioManager::setAudioMonitoring(Audio::DataConnection* monitoring)
|
||||
{
|
||||
mAudioMonitoring = monitoring;
|
||||
mAudioMonitoring = monitoring;
|
||||
}
|
||||
|
||||
Audio::DataConnection* AudioManager::audioMonitoring()
|
||||
{
|
||||
return mAudioMonitoring;
|
||||
return mAudioMonitoring;
|
||||
}
|
||||
|
||||
#define LOCK_MANAGER std::unique_lock<std::mutex> l(mGuard)
|
||||
void AudioManager::start(int usageId)
|
||||
{
|
||||
assert(mTerminal);
|
||||
LOCK_MANAGER;
|
||||
|
||||
ICELogInfo(<< "Start main audio with usage id " << usageId);
|
||||
assert(mTerminal);
|
||||
LOCK_MANAGER;
|
||||
|
||||
if (mUsage.obtain(usageId) > 1)
|
||||
return;
|
||||
ICELogInfo(<< "Start main audio with usage id " << usageId);
|
||||
|
||||
if (Audio::OsEngine::instance())
|
||||
Audio::OsEngine::instance()->open();
|
||||
if (mUsage.obtain(usageId) > 1)
|
||||
return;
|
||||
|
||||
if (!mAudioInput || !mAudioOutput)
|
||||
{
|
||||
// Disable AEC for now - because PVQA conflicts with speex AEC.
|
||||
std::shared_ptr<Audio::Enumerator> enumerator(Audio::Enumerator::make(usageId == atNull));
|
||||
if (!mTerminal->audio())
|
||||
{
|
||||
auto audio = std::make_shared<Audio::DevicePair>();
|
||||
audio->setAgc(true);
|
||||
audio->setAec(false);
|
||||
audio->setMonitoring(mAudioMonitoring);
|
||||
if (Audio::OsEngine::instance())
|
||||
Audio::OsEngine::instance()->open();
|
||||
|
||||
mTerminal->setAudio(audio);
|
||||
}
|
||||
if (!mAudioInput || !mAudioOutput)
|
||||
{
|
||||
// Disable AEC for now - because PVQA conflicts with speex AEC.
|
||||
std::shared_ptr<Audio::Enumerator> enumerator(Audio::Enumerator::make(usageId == atNull));
|
||||
if (!mTerminal->audio())
|
||||
{
|
||||
auto audio = std::make_shared<Audio::DevicePair>();
|
||||
audio->setAgc(true);
|
||||
audio->setAec(false);
|
||||
audio->setMonitoring(mAudioMonitoring);
|
||||
|
||||
if (!mAudioInput)
|
||||
{
|
||||
enumerator->open(Audio::myMicrophone);
|
||||
int inputIndex = enumerator->indexOfDefaultDevice();
|
||||
mTerminal->setAudio(audio);
|
||||
}
|
||||
|
||||
// Construct and set to terminal's audio pair input device
|
||||
if (usageId != atNull)
|
||||
mAudioInput = Audio::PInputDevice(Audio::InputDevice::make(enumerator->idAt(inputIndex)));
|
||||
else
|
||||
mAudioInput = Audio::PInputDevice(new Audio::NullInputDevice());
|
||||
if (!mAudioInput)
|
||||
{
|
||||
enumerator->open(Audio::myMicrophone);
|
||||
int inputIndex = enumerator->indexOfDefaultDevice();
|
||||
|
||||
mTerminal->audio()->setInput(mAudioInput);
|
||||
}
|
||||
// Construct and set to terminal's audio pair input device
|
||||
if (usageId != atNull)
|
||||
mAudioInput = Audio::PInputDevice(Audio::InputDevice::make(enumerator->idAt(inputIndex)));
|
||||
else
|
||||
mAudioInput = Audio::PInputDevice(new Audio::NullInputDevice());
|
||||
|
||||
if (!mAudioOutput)
|
||||
{
|
||||
Audio::Enumerator *enumerator = Audio::Enumerator::make(usageId == atNull);
|
||||
enumerator->open(Audio::mySpeaker);
|
||||
int outputIndex = enumerator->indexOfDefaultDevice();
|
||||
mTerminal->audio()->setInput(mAudioInput);
|
||||
}
|
||||
|
||||
// Construct and set terminal's audio pair output device
|
||||
if (usageId != atNull)
|
||||
{
|
||||
if (outputIndex >= enumerator->count())
|
||||
outputIndex = 0;
|
||||
if (!mAudioOutput)
|
||||
{
|
||||
Audio::Enumerator *enumerator = Audio::Enumerator::make(usageId == atNull);
|
||||
enumerator->open(Audio::mySpeaker);
|
||||
int outputIndex = enumerator->indexOfDefaultDevice();
|
||||
|
||||
mAudioOutput = Audio::POutputDevice(
|
||||
Audio::OutputDevice::make(enumerator->idAt(outputIndex)));
|
||||
}
|
||||
else
|
||||
mAudioOutput = Audio::POutputDevice(new Audio::NullOutputDevice());
|
||||
// Construct and set terminal's audio pair output device
|
||||
if (usageId != atNull)
|
||||
{
|
||||
if (outputIndex >= enumerator->count())
|
||||
outputIndex = 0;
|
||||
|
||||
mTerminal->audio()->setOutput(mAudioOutput);
|
||||
}
|
||||
}
|
||||
mAudioOutput = Audio::POutputDevice(
|
||||
Audio::OutputDevice::make(enumerator->idAt(outputIndex)));
|
||||
}
|
||||
else
|
||||
mAudioOutput = Audio::POutputDevice(new Audio::NullOutputDevice());
|
||||
|
||||
// Open audio
|
||||
if (mAudioInput)
|
||||
mAudioInput->open();
|
||||
if (mAudioOutput)
|
||||
mAudioOutput->open();
|
||||
mTerminal->audio()->setOutput(mAudioOutput);
|
||||
}
|
||||
}
|
||||
|
||||
// Open audio
|
||||
if (mAudioInput)
|
||||
mAudioInput->open();
|
||||
if (mAudioOutput)
|
||||
mAudioOutput->open();
|
||||
}
|
||||
|
||||
void AudioManager::close()
|
||||
{
|
||||
mUsage.clear();
|
||||
if (mAudioInput)
|
||||
{
|
||||
mAudioInput->close();
|
||||
mAudioInput.reset();
|
||||
}
|
||||
mUsage.clear();
|
||||
if (mAudioInput)
|
||||
{
|
||||
mAudioInput->close();
|
||||
mAudioInput.reset();
|
||||
}
|
||||
|
||||
if (mAudioOutput)
|
||||
{
|
||||
mAudioOutput->close();
|
||||
mAudioOutput.reset();
|
||||
}
|
||||
mPlayer.setOutput(Audio::POutputDevice());
|
||||
if (mAudioOutput)
|
||||
{
|
||||
mAudioOutput->close();
|
||||
mAudioOutput.reset();
|
||||
}
|
||||
mPlayer.setOutput(Audio::POutputDevice());
|
||||
}
|
||||
|
||||
void AudioManager::stop(int usageId)
|
||||
{
|
||||
LOCK_MANAGER;
|
||||
|
||||
ICELogInfo( << "Stop main audio with usage id " << usageId);
|
||||
if (mTerminal)
|
||||
{
|
||||
if (mTerminal->audio())
|
||||
mTerminal->audio()->player().release(usageId);
|
||||
}
|
||||
LOCK_MANAGER;
|
||||
|
||||
if (!mUsage.release(usageId))
|
||||
{
|
||||
close();
|
||||
ICELogInfo( << "Stop main audio with usage id " << usageId);
|
||||
if (mTerminal)
|
||||
{
|
||||
if (mTerminal->audio())
|
||||
mTerminal->audio()->player().release(usageId);
|
||||
}
|
||||
|
||||
// Reset device pair on terminal side
|
||||
mTerminal->setAudio(Audio::PDevicePair());
|
||||
if (!mUsage.release(usageId))
|
||||
{
|
||||
close();
|
||||
|
||||
if (Audio::OsEngine::instance())
|
||||
Audio::OsEngine::instance()->close();
|
||||
}
|
||||
// Reset device pair on terminal side
|
||||
mTerminal->setAudio(Audio::PDevicePair());
|
||||
|
||||
if (Audio::OsEngine::instance())
|
||||
Audio::OsEngine::instance()->close();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioManager::startPlayFile(int usageId, const std::string& path, AudioTarget target, LoopMode lm, int timelimit)
|
||||
{
|
||||
// Check if file exists
|
||||
Audio::PWavFileReader r = std::make_shared<Audio::WavFileReader>();
|
||||
// Check if file exists
|
||||
Audio::PWavFileReader r = std::make_shared<Audio::WavFileReader>();
|
||||
#ifdef TARGET_WIN
|
||||
r->open(StringHelper::makeTstring(path));
|
||||
r->open(StringHelper::makeTstring(path));
|
||||
#else
|
||||
r->open(path);
|
||||
r->open(path);
|
||||
#endif
|
||||
if (!r->isOpened())
|
||||
{
|
||||
ICELogError(<< "Cannot open file to play");
|
||||
return;
|
||||
}
|
||||
if (!r->isOpened())
|
||||
{
|
||||
ICELogError(<< "Cannot open file to play");
|
||||
return;
|
||||
}
|
||||
|
||||
// Delegate processing to existing audio device pair manager
|
||||
mTerminal->audio()->player().add(usageId, r, lm == lmLoopAudio, timelimit);
|
||||
start(usageId);
|
||||
// Delegate processing to existing audio device pair manager
|
||||
mTerminal->audio()->player().add(usageId, r, lm == lmLoopAudio, timelimit);
|
||||
start(usageId);
|
||||
}
|
||||
|
||||
void AudioManager::stopPlayFile(int usageId)
|
||||
{
|
||||
stop(usageId);
|
||||
mPlayer.release(usageId);
|
||||
stop(usageId);
|
||||
mPlayer.release(usageId);
|
||||
}
|
||||
|
||||
void AudioManager::onFilePlayed(Audio::Player::PlaylistItem& item)
|
||||
@@ -198,9 +198,9 @@ void AudioManager::onFilePlayed(Audio::Player::PlaylistItem& item)
|
||||
|
||||
void AudioManager::process()
|
||||
{
|
||||
mPlayer.releasePlayed();
|
||||
std::vector<int> ids;
|
||||
mTerminal->audio()->player().retrieveUsageIds(ids);
|
||||
for (unsigned i=0; i<ids.size(); i++)
|
||||
stop(ids[i]);
|
||||
mPlayer.releasePlayed();
|
||||
std::vector<int> ids;
|
||||
mTerminal->audio()->player().retrieveUsageIds(ids);
|
||||
for (unsigned i=0; i<ids.size(); i++)
|
||||
stop(ids[i]);
|
||||
}
|
||||
|
||||
@@ -14,19 +14,19 @@
|
||||
|
||||
enum
|
||||
{
|
||||
AudioPrefix_Ring = 1,
|
||||
AudioPrefix_Zero,
|
||||
AudioPrefix_One,
|
||||
AudioPrefix_Two,
|
||||
AudioPrefix_Three,
|
||||
AudioPrefix_Four,
|
||||
AudioPrefix_Five,
|
||||
AudioPrefix_Six,
|
||||
AudioPrefix_Seven,
|
||||
AudioPrefix_Eight,
|
||||
AudioPrefix_Nine,
|
||||
AudioPrefix_Asterisk,
|
||||
AudioPrefix_Diez
|
||||
AudioPrefix_Ring = 1,
|
||||
AudioPrefix_Zero,
|
||||
AudioPrefix_One,
|
||||
AudioPrefix_Two,
|
||||
AudioPrefix_Three,
|
||||
AudioPrefix_Four,
|
||||
AudioPrefix_Five,
|
||||
AudioPrefix_Six,
|
||||
AudioPrefix_Seven,
|
||||
AudioPrefix_Eight,
|
||||
AudioPrefix_Nine,
|
||||
AudioPrefix_Asterisk,
|
||||
AudioPrefix_Diez
|
||||
};
|
||||
|
||||
#define AudioSessionCoeff 64
|
||||
@@ -34,56 +34,56 @@ enum
|
||||
class AudioManager: public Audio::Player::EndOfAudioDelegate
|
||||
{
|
||||
public:
|
||||
AudioManager();
|
||||
virtual ~AudioManager();
|
||||
|
||||
static AudioManager& instance();
|
||||
|
||||
// Enforces to close audio devices. Used to shutdown AudioManager on exit from application
|
||||
void close();
|
||||
AudioManager();
|
||||
virtual ~AudioManager();
|
||||
|
||||
// Terminal and settings must be available for AudioManager
|
||||
void setTerminal(MT::Terminal* terminal);
|
||||
MT::Terminal* terminal();
|
||||
static AudioManager& instance();
|
||||
|
||||
void setAudioMonitoring(Audio::DataConnection* monitoring);
|
||||
Audio::DataConnection* audioMonitoring();
|
||||
// Enforces to close audio devices. Used to shutdown AudioManager on exit from application
|
||||
void close();
|
||||
|
||||
// Start/stop methods relies on usage counter; only first start and last stop opens/closes devices actually
|
||||
void start(int usageId);
|
||||
void stop(int usageId);
|
||||
|
||||
enum AudioTarget
|
||||
{
|
||||
atNull,
|
||||
atReceiver,
|
||||
atRinger
|
||||
};
|
||||
// Terminal and settings must be available for AudioManager
|
||||
void setTerminal(MT::Terminal* terminal);
|
||||
MT::Terminal* terminal();
|
||||
|
||||
enum LoopMode
|
||||
{
|
||||
lmLoopAudio,
|
||||
lmNoloop
|
||||
};
|
||||
void setAudioMonitoring(Audio::DataConnection* monitoring);
|
||||
Audio::DataConnection* audioMonitoring();
|
||||
|
||||
void startPlayFile(int usageId, const std::string& path, AudioTarget target, LoopMode lm, int timelimit = 0);
|
||||
void stopPlayFile(int usageId);
|
||||
|
||||
// Start/stop methods relies on usage counter; only first start and last stop opens/closes devices actually
|
||||
void start(int usageId);
|
||||
void stop(int usageId);
|
||||
|
||||
void onFilePlayed(Audio::Player::PlaylistItem& item);
|
||||
|
||||
// Must be called from main loop to release used audio devices
|
||||
void process();
|
||||
enum AudioTarget
|
||||
{
|
||||
atNull,
|
||||
atReceiver,
|
||||
atRinger
|
||||
};
|
||||
|
||||
enum LoopMode
|
||||
{
|
||||
lmLoopAudio,
|
||||
lmNoloop
|
||||
};
|
||||
|
||||
void startPlayFile(int usageId, const std::string& path, AudioTarget target, LoopMode lm, int timelimit = 0);
|
||||
void stopPlayFile(int usageId);
|
||||
|
||||
|
||||
void onFilePlayed(Audio::Player::PlaylistItem& item);
|
||||
|
||||
// Must be called from main loop to release used audio devices
|
||||
void process();
|
||||
|
||||
protected:
|
||||
Audio::PInputDevice mAudioInput;
|
||||
Audio::POutputDevice mAudioOutput;
|
||||
Audio::Player mPlayer;
|
||||
MT::Terminal* mTerminal;
|
||||
Audio::DataConnection* mAudioMonitoring;
|
||||
Audio::PInputDevice mAudioInput;
|
||||
Audio::POutputDevice mAudioOutput;
|
||||
Audio::Player mPlayer;
|
||||
MT::Terminal* mTerminal;
|
||||
Audio::DataConnection* mAudioMonitoring;
|
||||
|
||||
std::map<int, int> UsageMap;
|
||||
UsageCounter mUsage;
|
||||
std::mutex mGuard;
|
||||
std::map<int, int> UsageMap;
|
||||
UsageCounter mUsage;
|
||||
std::mutex mGuard;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -682,34 +682,34 @@ void AgentImpl::processUseStreamForSession(JsonCpp::Value& request, JsonCpp::Val
|
||||
}
|
||||
}
|
||||
else
|
||||
if (actionText == "write")
|
||||
if (actionText == "write")
|
||||
{
|
||||
if (path.empty())
|
||||
{
|
||||
if (path.empty())
|
||||
{
|
||||
// Turn off recording from the stream
|
||||
prov->writeFile(Audio::PWavFileWriter(), direction);
|
||||
answer["status"] = Status_Ok;
|
||||
}
|
||||
else
|
||||
{
|
||||
Audio::PWavFileWriter writer = std::make_shared<Audio::WavFileWriter>();
|
||||
if (!writer->open(strx::makeTstring(path), AUDIO_SAMPLERATE, AUDIO_CHANNELS))
|
||||
answer["status"] = Status_FailedToOpenFile;
|
||||
else
|
||||
{
|
||||
prov->writeFile(writer, direction);
|
||||
answer["status"] = Status_Ok;
|
||||
}
|
||||
}
|
||||
// Turn off recording from the stream
|
||||
prov->writeFile(Audio::PWavFileWriter(), direction);
|
||||
answer["status"] = Status_Ok;
|
||||
}
|
||||
else
|
||||
if (actionText == "mirror")
|
||||
{
|
||||
Audio::PWavFileWriter writer = std::make_shared<Audio::WavFileWriter>();
|
||||
if (!writer->open(strx::makeTstring(path), AUDIO_SAMPLERATE, AUDIO_CHANNELS))
|
||||
answer["status"] = Status_FailedToOpenFile;
|
||||
else
|
||||
{
|
||||
prov->setupMirror(request["enable"].asBool());
|
||||
prov->writeFile(writer, direction);
|
||||
answer["status"] = Status_Ok;
|
||||
}
|
||||
else
|
||||
answer["status"] = Status_AccountNotFound;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (actionText == "mirror")
|
||||
{
|
||||
prov->setupMirror(request["enable"].asBool());
|
||||
answer["status"] = Status_Ok;
|
||||
}
|
||||
else
|
||||
answer["status"] = Status_AccountNotFound;
|
||||
}
|
||||
else
|
||||
answer["status"] = Status_NoMediaAction;
|
||||
|
||||
Reference in New Issue
Block a user