This Section demonstrates how to use the Audio Manager API for compressed audio format playback.
1. Get the AudioFactory and AudioManager instances
auto &audioFactory = audioFactory::getInstance();
auto audioManager = audioFactory.getAudioManager();
2. Check if Audio subsystem is ready
bool subSystemStatus = audioManager->isSubsystemReady();
if (subSystemStatus) {
std::cout << "Audio Subsystem is ready." << std::endl;
} else {
std::cout << "Audio Subsystem is NOT ready." << std::endl;
}
2.1 If Audio subsystem is not ready, wait for it to be ready
Make sure that Audio subsystem is ready for services like audio play. If subsystem is not ready, wait unconditionally (or) until a timeout.
std::future<bool> f = audioManager->onSubsystemReady();
#if // Timeout based wait
if (f.wait_for(std::chrono::seconds(timeoutSec)) == std::future_status::timeout) {
std::cout << "operation timed out." << std::endl;
} else {
subSystemsStatus = f.get();
if (subSystemsStatus) {
std::cout << "Audio Subsystem is ready." << std::endl;
}
}
#else // Unconditional wait
subSystemsStatus = f.get();
if (subSystemsStatus) {
std::cout << "Audio Subsystem is ready." << std::endl;
} else {
std::cout << "Audio Subsystem is NOT ready." << std::endl;
}
#endif
### 3. Create an Audio Stream (Audio Playback Session)
void createStreamCallback(std::shared_ptr<IAudioStream> &stream, ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "createStream() returned with error " << static_cast<int>(error)
<< std::endl;
return;
}
std::cout << "createStream() succeeded." << std::endl;
audioPlayStream = std::dynamic_pointer_cast<IAudioPlayStream>(stream);
}
StreamConfig config;
config.type = StreamType::PLAY;
config.sampleRate = 48000;
config.format = AudioFormat::AMRWB_PLUS;
config.channelTypeMask = ChannelType::LEFT;
config.deviceTypes.emplace_back(DeviceType::DEVICE_TYPE_SPEAKER);
AmrwbpParams params;
params.bitWidth = 16;
params.frameFormat = AmrwbpFrameFormat::FILE_STORAGE_FORMAT;
config.formatParams = ¶ms;
status = audioManager->createStream(config, createStreamCallback);
### 4. Allocate Stream buffers for Playback operation
auto streamBuffer = audioPlayStream->getStreamBuffer();
if (streamBuffer != nullptr) {
size = streamBuffer->getMinSize();
if (size == 0) {
size = streamBuffer->getMaxSize();
}
streamBuffer->setDataSize(size);
} else {
std::cout << "Failed to get Stream Buffer " << std::endl;
}
### 5. Start write operation for playback to start
void writeCallback(std::shared_ptr<IStreamBuffer> buffer, uint32_t bytes, ErrorCode error)
{
if (error != ErrorCode::SUCCESS) {
std::cout << "write() returned with error " << static_cast<int>(error) << std::endl;
pipeLineEmpty_ = false;
}
buffer->reset();
return;
}
void onReadyForWrite() {
pipeLineEmpty_ = true;
}
memset(streamBuffer->getRawBuffer(),0x1,size);
auto status = audioPlayStream->write(streamBuffer, writeCallback);
if (status != telux::common::Status::SUCCESS) {
std::cout << "write() failed with error" << static_cast<int>(status) << std::endl;
} else {
std::cout << "Request to write to stream sent" << std::endl;
}
### 6.1 Stop playback operation(STOP_AFTER_PLAY : Stops after playing pending buffers in pipeline)
2 auto status = audioPlayStream_->stopAudio(StopType::STOP_AFTER_PLAY, [&p](ErrorCode error) {
3 if (error == ErrorCode::SUCCESS) {
7 std::cout << "Failed to stop after playing buffers" << std::endl;
10 if (status == Status::SUCCESS) {
11 std::cout << "Request to stop playback after pending buffers Sent" << std::endl;
13 std::cout << "Request to stop playback after pending buffers failed" << std::endl;
15 if (p.get_future().get()) {
16 std::cout << "Pending buffers played successful !!" << std::endl;
### 6.2 Stop playback operation(FORCE_STOP : Stops immediately, all buffers in pipeline are flushed)
2 auto status = audioPlayStream_->stopAudio(
3 StopType::FORCE_STOP, [&p](telux::common::ErrorCode error) {
4 if (error == telux::common::ErrorCode::SUCCESS) {
8 std::cout << "Failed to force stop" << std::endl;
11 if(status == telux::common::Status::SUCCESS){
12 std::cout << "Request to force stop Sent" << std::endl;
14 std::cout << "Request to force stop failed" << std::endl;
16 if (p.get_future().get()) {
17 std::cout << "Force Stop successful !!" << std::endl;
7. Delete an Audio Stream (Audio Playback Session), once reached end of operation.
void deleteStreamCallback(ErrorCode error) {
if (error != ErrorCode::SUCCESS) {
std::cout << "deleteStream() returned with error " << static_cast<int>(error)
<< std::endl;
return;
}
std::cout << "deleteStream() succeeded." << std::endl;
audioPlayStream = nullptr;
}
Status status = audioManager->deleteStream(audioPlayStream, deleteStreamCallback);
if (status != Status::SUCCESS) {
std::cout << "deleteStream failed with error" << static_cast<int>(status) << std::endl;
}