Telematics SDK 介绍(4)

240 篇文章 11 订阅

5.6 audio

如下,是与音频相关的示例应用程序列表:

•音频管理器API(Audio Manager API)
•音频回放会话(Audio playback session)
•音频捕获会话(Audio capture session)
•音频回环会话(Audio loopback session)
•音频生成(Audio tone generation)
•音频语音会话启动和停止(Audio voice session start and stop)
•音频语音会话音量/静音控制( Audio voice session volume/mute control)
•音频语音会话设备切换(Audio voice session device switch)
•使用音频管理器api在语音通话中播放DTMF音调(Using Audio Manager APIs to play DTMF tone in a voice call)
•使用音频管理器api检测语音呼叫中的DTMF音调(Using Audio Manager APIs to detect DTMF tones in a voice call)
•音频转码操作(Audio transcoding operation)
•压缩音频格式播放(Compressed audio format playback)
•压缩音频格式播放语音路径(Compressed audio format playback on voice paths)

5.6.1 音频管理器API

音频管理器API示例参考

本节演示如何使用Audio Manager API进行音频子系统/流操作。

  1. 获取AudioFactory实例
#include "AudioFactory.hpp"
#include "AudioManager.hpp"
using namespace telux::common;
using namespace telux::audio;
// Globals

static std::shared_ptr<IAudioManager> audioManager;
static std::shared_ptr<IAudioVoiceStream> audioVoiceStream;
Status status;
auto &audioFactory = audioFactory::getInstance()
  1. 获取audimanager对象并检查音频子系统是否就绪
    std::promise<ServiceStatus> prom{};
    // Get AudioManager instance.
    audioManager = audioFactory.getAudioManager([&prom](ServiceStatus serviceStatus) {
        prom.set_value(serviceStatus);
    });
    if (!audioManager) {
        std::cout << "Failed to get AudioManager object" << std::endl;
        return;
    }
    // Check if audio subsystem is ready
    // If audio subsystem is not ready, wait for it to be ready
    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();
    }
    // Check the service status again.
    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;
    }
  1. 查询音频子系统支持的设备和流类型

下面的方法提供了支持的设备类型和流类型的详细信息

3.1 查询音频子系统支持的设备类型

    //Callback to get supported device type details.
    void getDevicesCallback(std::vector<std::shared_ptr<IAudioDevice>> devices, ErrorCode error)
    {
        if (error != ErrorCode::SUCCESS) {
            std::cout << "getDevices() 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<unsigned int>(device_type->getType()) << ", direction: "
            << static_cast<unsigned int>(device_type->getDirection()) << std::endl;
            i++;
        }
    }
    //Query Supported Device type details.
    status = audioManager->getDevices(getDevicesCallback);

3.2 查询音频子系统支持的流类型

    //Callback to get supported stream type details.
    void getStreamTypesCallback(std::vector<StreamType> streams, ErrorCode error)
    {
        if (error != ErrorCode::SUCCESS) {
            std::cout << "getStreamTypes() returned with error " << static_cast<unsigned int>(error)
                << std::endl;   
            return;
        }
        int i = 0;
        for (auto stream_type : streams) {
            std::cout << "Stream [" << i << "] type: " << static_cast<unsigned int>(stream_type)
                << std::endl;
            i++;
        }
    }
    //Query Supported stream type details.
    status = audioManager->getStreamTypes(getStreamTypesCallback);
  1. 创建音频流(语音通话会话)
    //Callback which provides response to createStream, with pointer to base interface IAudioStream.
    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);
    }
    //Create an Audio Stream (Voice Call Session)
    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);
  1. 删除先前创建的音频流(语音呼叫会话)
    //Callback which provides response to deleteStream
    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();
    }
    //Delete an Audio Stream (Voice Call Session), which was created earlier
    status = audioManager->deleteStream(std::dynamic_pointer_cast<IAudioStream>(audioVoiceStream),
    deleteStreamCallback);

5.6.2 音频 回放会话

音频管理器API示例参考音频回放会话

本节演示如何使用音频管理器API进行音频回放会话。

  1. 获取AudioFactory实例
    auto &audioFactory = audioFactory::getInstance();
  1. 获取audimanager对象并检查音频子系统是否就绪
    std::promise<ServiceStatus> prom{};
    // Get AudioManager instance.
    audioManager = audioFactory.getAudioManager([&prom](ServiceStatus serviceStatus) {
        prom.set_value(serviceStatus);
    });
    if (!audioManager) {
        std::cout << "Failed to get AudioManager object" << std::endl;
        return;
    }
    // Check if audio subsystem is ready
    // If audio subsystem is not ready, wait for it to be ready
    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();
    }
    // Check the service status again.
    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;
    }
  1. 创建音频流(音频回放会话)
    //Callback which provides response to createStream, with pointer to base interface IAudioStream.
    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);
    }
    //Create an Audio Stream (Audio Playback Session)
    StreamConfig config;
    config.type = StreamType::PLAY;
    config.sampleRate = 48000;
    config.format = AudioFormat::PCM_16BIT_SIGNED;
    config.channelTypeMask = ChannelType::LEFT;
    config.deviceTypes.emplace_back(DeviceType::DEVICE_TYPE_SPEAKER);
    status = audioManager->createStream(config, createStreamCallback);
  1. 为播放操作分配流缓冲区
    // Get an audio buffer (can get more than one)
    auto streamBuffer = audioPlayStream->getStreamBuffer();
    if (streamBuffer != nullptr) {
        // Setting the size that is to be written to stream as the minimum size
        // required by stream. In any case if size returned is 0, using the Maximum
        // Buffer Size, any buffer size between min and max can be used
        size = streamBuffer->getMinSize();
        if (size == 0) {
            size = streamBuffer->getMaxSize();
        }
        streamBuffer->setDataSize(size);
    } else {
        td::cout << "Failed to get Stream Buffer " << std::endl;
    }
  1. 开始写操作,播放开始
    //Callback which provides response to write operation.
    void writeCallback(std::shared_ptr<IStreamBuffer> buffer, uint32_t size, ErrorCode error)
    {
        if (error != ErrorCode::SUCCESS) {
            std::cout << "write() returned with error " << static_cast<int>(error) << std::endl;
        } else {
            std::cout << "Successfully written " << size << " bytes" << std::endl;
        }
        buffer->reset();
        return;
    }
    //Write desired data into the buffer
    //First write starts Playback Session.
    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;
    }
  1. 删除音频流(音频回放会话),一旦达到操作结束
    //Callback which provides response to deleteStream
    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.reset();
    }
    //Delete an Audio Stream (Audio Playback Session), once reached end of operation.
    Status status = audioManager->deleteStream(
    std::dynamic_pointer_cast<IAudioStream>(audioPlayStream), deleteStreamCallback);
    if (status != Status::SUCCESS) {
        std::cout << "deleteStream failed with error" << static_cast<int>(status) << std::endl;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值