This sample app demostrates how to use audio APIs to play DTMF tones during an active voice call. Please note that only Rx direction is supported currently.
1. Get the AudioFactory instance
auto &audioFactory = AudioFactory::getInstance();
2. Get the AudioManager instance and check for audio subsystem readiness
std::promise<ServiceStatus> prom{};
audioManager = audioFactory.getAudioManager([&prom](ServiceStatus serviceStatus) {
prom.set_value(serviceStatus);
});
if (!audioManager) {
std::cout << "Failed to get AudioManager instance" << std::endl;
return;
}
ServiceStatus managerStatus = audioManager->getServiceStatus();
if (managerStatus != ServiceStatus::SERVICE_AVAILABLE) {
std::cout << "\nAudio subsystem is not ready, Please wait ..." << std::endl;
managerStatus = prom.get_future().get();
}
if (managerStatus == ServiceStatus::SERVICE_AVAILABLE) {
std::cout << "Audio Subsytem is Ready << std::endl;
} else {
std::cout << "ERROR - Unable to initialize audio subsystem" << std::endl;
return;
}
3. Create an audio stream (to be associated with a voice call session)
void createStreamCallback(std::shared_ptr<IAudioStream> &stream, ErrorCode error) {
if (error != ErrorCode::SUCCESS) {
std::cout << "createStream() failed with error" << static_cast<int>(error) << std::endl;
return;
}
std::cout << "createStream() succeeded." << std::endl;
audioVoiceStream = std::dynamic_pointer_cast<IAudioVoiceStream>(stream);
}
StreamConfig config;
config.type = StreamType::VOICE_CALL;
config.slotId = DEFAULT_SLOT_ID;
config.sampleRate = 16000;
config.format = AudioFormat::PCM_16BIT_SIGNED;
config.channelTypeMask = ChannelType::LEFT;
config.deviceTypes.emplace_back(DeviceType::DEVICE_TYPE_SPEAKER);
config.deviceTypes.emplace_back(DeviceType::DEVICE_TYPE_MIC);
status = audioManager->createStream(config, createStreamCallback);
4. Start the voice call session
void startAudioCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "startAudio() failed with error " << static_cast<int>(error) << std::endl;
return;
}
std::cout << "startAudio() succeeded." << std::endl;
}
status = audioVoiceStream->startAudio(startAudioCallback);
5. Play a DTMF tone
void playDtmfCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "playDtmfTone() failed with error" << static_cast<int>(error) << std::endl;
return;
}
std::cout << "playDtmfTone() succeeded." << std::endl;
}
status = audioVoiceStream->playDtmfTone(dtmfTone, duration, gain, playDtmfCallback);
6. Stop the voice call session
void stopAudioCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "stopAudio() failed with error " << static_cast<int>(error) << std::endl;
return;
}
std::cout << "stopAudio() succeeded." << std::endl;
}
status = audioVoiceStream->stopAudio(stopAudioCallback);
7. Dispose the audio stream associated with the voice call session
void deleteStreamCallback(ErrorCode error) {
if (error != ErrorCode::SUCCESS) {
std::cout << "deleteStream() failed with error" << static_cast<int>(error) << std::endl;
return;
}
std::cout << "deleteStream() succeeded." << std::endl;
audioVoiceStream->reset();
}
status = audioManager->deleteStream(std::dynamic_pointer_cast<IAudioStream>(audioVoiceStream),
deleteStreamCallback);