一、什么是多声道功放?

多声道功放(Multi-channel Amplifier),是指能够同时驱动两个或两个以上独立声道的音频功率放大器。与传统的立体声(2.0)功放不同,多声道功放专为环绕声系统设计,能够将音频信号分配到多个音箱,营造出身临其境的三维声场。

常见的多声道配置包括:

声道配置 常见名称 典型应用场景
5.1 基础环绕声 家庭影院入门
7.1 增强环绕声 进阶家庭影院
5.1.2/7.1.4 全景声(Atmos) 高端影院/影音室
9.1.6 沉浸式音频 旗舰级私人影院

例如 5.1.2 表示:5个地面声道 + 1个低音炮声道 + 2个天空声道(来自Dolby Atmos和DTS:X标准)。

openharmony当前支持的多声道

二、多声道功放的核心架构

5.1声道是由前置左/右声道、后置左/右环绕声道、中置声道及重低音声道组成的多声道音频系统,其中“.1”表示频响范围20-120Hz的低频独立输出声道。该系统通过五个全频段扬声器与一个超低音扬声器组合,可精确还原人声对白、环境音效及动态低音,广泛应用于家庭影院、车载音响及数字影院场景,并成为杜比Digital、DTS等音频编码标准的技术基础 。
该技术由4.1环绕系统升级而来,通过增加中置声道强化声音定位。后续演进中,7.1声道新增双后置声道提升声场覆盖精度,而杜比全景声技术引入垂直方向音效处理 。针对传统5.1声道设备成本高、布线复杂的问题,音频处理技术通过虚拟声道映射实现耳机播放5.1音效,无线后环绕方案则降低了安装门槛 。在车载应用中,各声道喇叭分布于A柱、车门及后备箱区域,通过独立DSP功放提升低频表现 。

三,搭建多声道系统

[左环绕] ---- [中置] ---- [右环绕]
           /              \
     [左前置]          [右前置]
                |
           [低音炮]

低音炮,左右环绕与主机通过蓝牙配对。主机通过hdmi连接显示器,内置主板,搭载鸿蒙系统。HDMI 2.1接口数量:至少4进1出,支持eARC回传。

代码路径:foundation/multimedia/audio_framework/frameworks/native/hdiadapter_new/sink/multichannel_audio_render_sink.cpp

初始化并启动多声道音频输出设备,配置相关参数(如音量、采样率、通道数),并准备开始播放音频数据。

int32_t MultichannelAudioRenderSink::Start(void)
{
    std::lock_guard<std::mutex> lock(sinkMutex_);
    Trace trace("MultichannelAudioRenderSink::Start");
#ifdef FEATURE_POWER_MANAGER
    if (runningLock_ == nullptr) {
        WatchTimeout guard("create AudioRunningLock start");
        runningLock_ = std::make_shared<AudioRunningLock>(std::string(RUNNING_LOCK_NAME_BASE) + halName_);
        guard.CheckCurrTimeout();
    }
    if (runningLock_ != nullptr) {
        runningLock_->Lock(RUNNING_LOCK_TIMEOUTMS_LASTING);
    } else {
        AUDIO_ERR_LOG("running lock is null, playback can not work well");
    }
#endif
    dumpFileName_ = "multichannel_sink_" + GetTime() + "_" + std::to_string(attr_.sampleRate) + "_" +
        std::to_string(attr_.channel) + "_" + std::to_string(attr_.format) + ".pcm";
    DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_SERVER_PARA, dumpFileName_, &dumpFile_);
    if (started_) {
        return SUCCESS;
    }
    CHECK_AND_RETURN_RET_LOG(audioRender_ != nullptr, ERR_INVALID_HANDLE, "render is nullptr");
    int32_t ret = audioRender_->Start(audioRender_);
    CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "start fail");
    UpdateSinkState(true);
    started_ = true;

    uint64_t frameSize = 0;
    uint64_t frameCount = 0;
   // 获取帧大小和帧数
    ret = audioRender_->GetFrameSize(audioRender_, &frameSize);
    CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "get frame size fail");
    ret = audioRender_->GetFrameCount(audioRender_, &frameCount);
    CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "get frame count fail");
   //设置音量
    ret = audioRender_->SetVolume(audioRender_, 1);
    CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "set volume fail");
    AUDIO_INFO_LOG("start success, frameSize: %{public}" PRIu64 ", frameCount: %{public}" PRIu64, frameSize,
        frameCount);
    AudioPerformanceMonitor::GetInstance().RecordTimeStamp(ADAPTER_TYPE_MULTICHANNEL, INIT_LASTWRITTEN_TIME);
    return SUCCESS;
}

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐