qcc51xx如何配置spdif输入

本文详细介绍了QCC51xx系列芯片如何进行SPDIF输入的配置,涵盖了设置步骤和关键参数调整,适用于高通QCC系列蓝牙音频SoC的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 qcc51xx如何配置spdif输入

/*
Copyright (c) 2005 - 2018 Qualcomm Technologies International, Ltd.
*/
/**
\file
\ingroup sink_app
\brief
    This file handles all Synchronous connection messages
 
*/
 
 
/****************************************************************************
    Header files
*/
#ifdef ENABLE_GAA
#include <sink2gaa.h>
#endif /* ENABLE_GAA */
#include "sink_private_data.h"
#include "sink_main_task.h"
#include "sink_audio.h"
#include "sink_hfp_data.h"
#include "sink_statemanager.h"
#include "sink_powermanager.h"
#include "sink_pio.h"
#include "sink_link_policy.h"
#include "sink_tones.h"
#include "sink_volume.h"
#include "sink_speech_recognition.h"
#include "sink_wired.h"
#include "sink_display.h"
#include "sink_audio_routing.h"
#include "sink_peer.h"
#include "sink_swat.h"
#include "sink_ba.h"
#include "sink_ba_broadcaster.h"
#include "sink_ble.h"
#include "sink_callmanager.h"
#include "sink_malloc_debug.h"
#include "sink_usb.h"
 
#include <audio_plugin_voice_variants.h>
#include <audio_plugin_output_variants.h>
#include <connection.h>
#include <hfp.h>
#include <stdlib.h>
#include <audio.h>
#include <audio_plugin_if.h>
#include <sink.h>
#include <bdaddr.h>
#include <inquiry.h>
#include "sink_sc.h"
#include "sink_gaia.h"
 
/* Audio params used for second SCO */
const hfp_audio_params multipoint_params = {8000, 7, sync_air_coding_cvsd, sync_retx_power_usage};
 
#define ALLOWANCE_FOR_TRANSITION_IN_HFP_CALL_STATE        1000
 
#ifdef DEBUG_AUDIO
 
#define AUD_DEBUG(x) DEBUG(x)
#else
#define AUD_DEBUG(x)
#endif
 
/****************************************************************************
NAME
    audioPriorLatency
 
DESCRIPTION
    Return initial latency estimate for given endpoint codec
 
RETURNS
    Predicted latency in milliseconds
*/
uint16 audioPriorLatency(uint8 seid)
{
 
    uint16 latency_ms;
 
#if defined ENABLE_PEER && defined PEER_TWS
    if (peerIsThisDeviceTwsSlave())
    {
 
        /* TWS Master will send time-to-play values when it relays, hence target latency on slave should be zero */
        latency_ms = AUDIO_LATENCY_TWS_NULL;
    }
    else
#endif /* defined ENABLE_PEER && defined PEER_TWS */
    {
 
        switch (seid & BASE_SEID_MASK)
        {
 
        case FASTSTREAM_SEID:
        case APTX_SPRINT_SEID:
        case APTX_LL_SEID:
            latency_ms = AUDIO_LATENCY_SHORT_MS;
            break;
 
        case APTXHD_SEID:
            latency_ms = AUDIO_LATENCY_LONG_MS;
            break;
 
        case AAC_SEID:
            /* Use the same latency for AAC regardless of whether we are in TWS or non-TWS use case
              * This will only work if the AAC decoder is capable of latency this high in non-TWS cases
              */
            latency_ms = AUDIO_LATENCY_AAC_MS;
            break;
 
        case APTX_SEID:
            latency_ms = AUDIO_LATENCY_APTX_MS;
            break;
 
        case SBC_SEID:
            latency_ms = AUDIO_LATENCY_SBC_MS;
            break;
 
        case MP3_SEID:
            latency_ms = AUDIO_LATENCY_MP3_MS;
            break;
 
        default:
            latency_ms = AUDIO_LATENCY_NORMAL_MS;
            break;
        }
    }
 
    AUD_DEBUG(("AUD: seid=%u latency=%u\n", seid, latency_ms));
    return latency_ms;
}
/****************************************************************************
NAME
    getScoPriorityFromHfpPriority
 
DESCRIPTION
    obtain the current sco priority level of the AG priority passed in
 
RETURNS
    current sco priority level, if any, may not have a sco
*/
audio_priority getScoPriorityFromHfpPriority(hfp_link_priority priority)
{
 
    AUD_DEBUG(("AUD: GetScoPriority - %d=%d\n",priority,sinkHfpDataGetScoPriority(PROFILE_INDEX(OTHER_PROFILE(priority))))) ;
    return sinkHfpDataGetScoPriority(PROFILE_INDEX(OTHER_PROFILE(priority)));
}
 
/****************************************************************************
NAME
    setScoPriorityFromHfpPriority
 
DESCRIPTION
    sets the current sco priority level of the AG priority passed in
 
RETURNS
    nothing
*/
void setScoPriorityFromHfpPriority(hfp_link_priority priority, audio_priority level)
{
 
    AUD_DEBUG(("AUD: SetScoPriority - %d=%d\n",priority,level)) ;
    if(priority != hfp_invalid_link)
      sinkHfpDataSetScoPriority(level,PROFILE_INDEX(OTHER_PROFILE(priority)));
}
 
 
/****************************************************************************
NAME
    audioGetLinkPriority
 
DESCRIPTION
    Common method of getting the link we want to manipulate audio settings on
 
RETURNS
 
*/
hfp_link_priority audioGetLinkPriority ( bool audio )
{
 
    hfp_link_priority priority;
 
    /* See if we can get a link from the device audio sink... */
    priority = HfpLinkPriorityFromAudioSink(sinkAudioGetRoutedVoiceSink());
 
    /* if the call is in outgoing call state */
    if(!priority)
        priority = HfpLinkPriorityFromCallState(hfp_call_state_outgoing);
 
    /* If that fails see if we have an active call... */
    if(priority == hfp_invalid_link)
        priority = HfpLinkPriorityWithActiveCall(audio);
 
    /* if there is an incoming call [get first incoming] */
    if(priority == hfp_invalid_link)
        priority = HfpGetFirstIncomingCallPriority();
 
    /* If we got something return it, otherwise return primary link */
    return ((priority != hfp_invalid_link) ? priority : hfp_primary_link);
}
 
/****************************************************************************
NAME
    audioSwapMediaChannel
 
DESCRIPTION
    attempt to swap between media channels if two channels exist and one of them
    is currentyl being routed to the speaker.
RETURNS
    successful or not status
*/
bool audioSwapMediaChannel(void)
{
 
    a2dp_stream_state a2dpStatePri = a2dp_stream_idle;
    a2dp_stream_state a2dpStateSec = a2dp_stream_idle;
    Sink a2dpSinkPri = 0;
    Sink a2dpSinkSec = 0;
 
    /* if a2dp connected obtain the current streaming state for primary a2dp connection */
    getA2dpStreamData(a2dp_primary, &a2dpSinkPri, &a2dpStatePri);
 
    /* if a2dp connected obtain the current streaming state for secondary a2dp connection */
    getA2dpStreamData(a2dp_secondary, &a2dpSinkSec, &a2dpStateSec);
 
    /* check whether a2dp pri is currently being routed and a2dp sec is available */
    if((sinkAudioGetRoutedAudioSink() == a2dpSinkPri)&&(a2dpSinkSec)&&(a2dpStateSec == a2dp_stream_streaming))
    {
 
        /* swap to a2dp secondary */
        audioDisconnectRoutedAudio();
        audioRouteSpecificA2dpSource(audio_source_a2dp_2);
        return TRUE;
    }
    /* check whether a2dp sec is currently being routed and swap to a2dp pri */
    else if((sinkAudioGetRoutedAudioSink() == a2dpSinkSec)&&(a2dpSinkPri)&&(a2dpStatePri == a2dp_stream_streaming))
    {
 
        audioDisconnectRoutedAudio();
        audioRouteSpecificA2dpSource(audio_source_a2dp_1);
        return TRUE;
    }
    /* not possible to swap media channels */
    return FALSE;
}
 
/****************************************************************************
NAME
    audioShutDownForUpgrade
 
DESCRIPTION
    Disconnects any routed voice/audio sources and once the audio busy 
    pointer is cleared, messages sink_upgrade to proceed
 
RETURNS
    void
*/
void audioShutDownForUpgrade(Task task, MessageId id)
{
 
    audioDisconnectRoutedVoice();
    audioSuspendDisconnectAudioSource();
 
    MessageSendConditionallyOnTask(task, id, NULL, AudioBusyPtr());
}
 
/****************************************************************************
NAME
    audioGetSettings
 

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值