This sample application demonstrates how to use audio APIs for switching audio devices during active voice session.
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 a voice call session
void createStreamCallback(std::shared_ptr<IAudioStream> &stream, ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "createStream() returned with error " << static_cast<unsigned 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);
status = audioManager->createStream(config, createStreamCallback);
4. Start voice call session
void startAudioCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "startAudio() returned with error " << static_cast<unsigned int>(error)
<< std::endl;
return;
}
std::cout << "startAudio() succeeded." << std::endl;
}
status = audioVoiceStream->startAudio(startAudioCallback);
5. Device switch on Started Audio Stream (Voice Call Session)
void setStreamDeviceCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "setDevice() returned with error " << static_cast<unsigned int>(error)
<< std::endl;
return;
}
std::cout << "setDevice() succeeded." << std::endl;
}
std::vector<DeviceType> devices;
devices.emplace_back(DeviceType::DEVICE_TYPE_SPEAKER);
status = audioVoiceStream->setDevice(devices, setStreamDeviceCallback);
6. Query device used for a given audio stream
void getStreamDeviceCallback(std::vector<DeviceType> devices, ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "getDevice() returned with error " << static_cast<unsigned int>(error)
<< std::endl;
return;
}
int i = 0;
for (auto device_type : devices) {
std::cout << "Device [" << i << "] type: " << static_cast<uint32_t>(device_type)
<< std::endl;
i++;
}
}
status = audioVoiceStream->getDevice(getStreamDeviceCallback);
7. Stop voice call session
void stopAudioCallback(ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "stopAudio() returned with error " << static_cast<unsigned int>(error)
<< std::endl;
return;
}
std::cout << "stopAudio() succeeded." << std::endl;
}
status = audioVoiceStream->stopAudio(stopAudioCallback);
8. Dispose audio stream
void deleteStreamCallback(ErrorCode error) {
if (error != ErrorCode::SUCCESS) {
std::cout << "deleteStream() returned with error " << static_cast<unsigned int>(error)
<< std::endl;
return;
}
std::cout << "deleteStream() succeeded." << std::endl;
audioVoiceStream.reset();
}
status = audioManager->deleteStream(std::dynamic_pointer_cast<IAudioStream>(audioVoiceStream),
deleteStreamCallback);