android6.0 framework修改使用两个声卡

原创 2016年06月02日 11:45:40


底层有两个声卡,一个声卡播放alarm通道的声音,另外一个播放其他通道的声音

1)增加一个hal层库

复制Z:\myandroid\hardware\imx\alsa代码,修改Android.mk编译生成另外一个so库

2)修改代码一个hal层库播放一种声音。

系统起来以后会加载audio的hardware库,检测声卡,保存声卡信息。在使用mediaplayer或者audiotrack播放声音时,会通过stream_type 找对应的设备,在通过设备在要使用哪个声卡。

修改scan_available_device()函数实现,因为两个声卡的驱动名字一样,不能通过这个来加载,要不然两个audio库都会加载两个声卡。

// change compare name , because two sound card have same driver name
            //if(strstr(control_card_info_get_driver(imx_control), audio_card_list[j]->driver_name) != NULL){
            if(strstr(control_card_info_get_name(imx_control), audio_card_list[j]->name) != NULL){

修改audio_policy.conf文件:增加:

这个代表第二个hardware库的信息。支持哪些设备等。

 sub {    
      outputs {
      sub_device  {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET
      }
    }
  }


修改声卡设置信息:主要支持的设备和audio_policy.conf中配置的设备要一致。第一个声卡:

static struct audio_card  wm8958_card = {

    //modified by leo, change sound card
    //.name = "wm8958-audio",
    //.driver_name = "wm8958-audio",
    .name = "imx-audio-ms6323",
    .driver_name = "imx-audio-ms6323",

supported_out_devices = (AUDIO_DEVICE_OUT_EARPIECE |
            AUDIO_DEVICE_OUT_SPEAKER |
            AUDIO_DEVICE_OUT_WIRED_HEADSET |
            AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
            AUDIO_DEVICE_OUT_ALL_SCO |
            AUDIO_DEVICE_OUT_DEFAULT),

第二个声卡:

/* ALSA cards for IMX, these must be defined according different board / kernel config*/
static struct audio_card  wm8958_card = {

    //modified by leo, change sound card
    //.name = "wm8958-audio",
    //.driver_name = "wm8958-audio",
    .name = "imx-audio-ms6324",
    .driver_name = "imx-audio-ms6324",
    .supported_out_devices = (AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),


好了,剩下的就是把特定的straem_type导向到那个声卡:

首先在RoutingStrategy.h中增加一个路由节点:

enum routing_strategy {
    STRATEGY_MEDIA,
    STRATEGY_PHONE,
    STRATEGY_SONIFICATION,
    STRATEGY_SONIFICATION_RESPECTFUL,
    STRATEGY_DTMF,
    STRATEGY_ENFORCED_AUDIBLE,
    STRATEGY_TRANSMITTED_THROUGH_SPEAKER,
    STRATEGY_ACCESSIBILITY,
    STRATEGY_REROUTING,

    //modified by leo, change alarm sound use another sound card, 2016-5-18
    STRATEGY_SUB,
    NUM_STRATEGIES
};

在修改Engine.cpp,把stream_type中的alarm通道声音导向这个路由:

routing_strategy Engine::getStrategyForStream(audio_stream_type_t stream)
{
    // stream to strategy mapping
    switch (stream) {
    case AUDIO_STREAM_VOICE_CALL:
    case AUDIO_STREAM_BLUETOOTH_SCO:
        return STRATEGY_PHONE;
    case AUDIO_STREAM_RING:
        return STRATEGY_SONIFICATION;
    case AUDIO_STREAM_ALARM:
        //return STRATEGY_SONIFICATION;
        ////modified by leo, change alarm sound use another sound card, 2016-5-18
        ALOGV("change alarm sound use another sound card");
        return STRATEGY_SUB;
    case AUDIO_STREAM_NOTIFICATION:
        return STRATEGY_SONIFICATION_RESPECTFUL;
    case AUDIO_STREAM_DTMF:
        return STRATEGY_DTMF;
    default:
        ALOGE("unknown stream type %d", stream);
    case AUDIO_STREAM_SYSTEM:
        // NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
        // while key clicks are played produces a poor result
    case AUDIO_STREAM_MUSIC:
        return STRATEGY_MEDIA;
    case AUDIO_STREAM_ENFORCED_AUDIBLE:
        return STRATEGY_ENFORCED_AUDIBLE;
    case AUDIO_STREAM_TTS:
        return STRATEGY_TRANSMITTED_THROUGH_SPEAKER;
    case AUDIO_STREAM_ACCESSIBILITY:
        return STRATEGY_ACCESSIBILITY;
    case AUDIO_STREAM_REROUTING:
        return STRATEGY_REROUTING;
    }
}


routing_strategy Engine::getStrategyForUsage(audio_usage_t usage)
{
    const SwAudioOutputCollection &outputs = mApmObserver->getOutputs();

    // usage to strategy mapping
    switch (usage) {
    case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
        if (outputs.isStreamActive(AUDIO_STREAM_RING) ||
                outputs.isStreamActive(AUDIO_STREAM_ALARM)) {
            return STRATEGY_SONIFICATION;
        }
        if (isInCall()) {
            return STRATEGY_PHONE;
        }
        return STRATEGY_ACCESSIBILITY;

    case AUDIO_USAGE_MEDIA:
    case AUDIO_USAGE_GAME:
    case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
    case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
        return STRATEGY_MEDIA;

    case AUDIO_USAGE_VOICE_COMMUNICATION:
        return STRATEGY_PHONE;

    case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
        return STRATEGY_DTMF;

    case AUDIO_USAGE_ALARM:
    case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
        //return STRATEGY_SONIFICATION;
        ////modified by leo, change alarm sound use another sound card, 2016-5-18
        return STRATEGY_SUB;
    
    case AUDIO_USAGE_NOTIFICATION:
    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
    case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
    case AUDIO_USAGE_NOTIFICATION_EVENT:
        return STRATEGY_SONIFICATION_RESPECTFUL;

    case AUDIO_USAGE_UNKNOWN:
    default:
        return STRATEGY_MEDIA;
    }
}


再在audio_devices_t Engine::getDeviceForStrategy(routing_strategy strategy) const函数中,把这个路由节点的设备改为AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET

这个设备只在第二个声卡配置中才支持,所以就使用第二个声卡播放alarm的声音。

    case STRATEGY_SUB:        
        ALOGV("do getDeviceForStrategy availableOutputDevices.types()=0x%x",availableOutputDevices.types());
        device = AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET;    
        break;




列出android 声卡

cat /proc/asound/pcm
  • mirkerson
  • mirkerson
  • 2016年01月12日 12:21
  • 1491

android 音频系统/声卡驱动 codec

0. 专用术语 1. 物理结构 2. 系统架构   本文基于Freescale IMX平台Codec ALC5625为例。 0. 专用术语  ASLA - Advanced Sound...
  • lp542718520
  • lp542718520
  • 2017年04月19日 00:11
  • 1338

Android如何实现音频输出切换

扬声器输出和耳机输出是音频系统最基本的音频输出通路,实际应用中用户可根据自己需要随意切换,具体表现是通过插入耳机选择耳机输出,拔出耳机选择默认的扬声器输出。                 如上图所...
  • lindonghai
  • lindonghai
  • 2016年01月15日 13:42
  • 3037

android下调试声卡驱动之总结

1、在调试中出现问题后,首先看I2C通信有没有问题,wm8960寄存器的设置是靠I2C来完成,另外I2C通信不成功在开发板中是没      有声卡相关的设备节点。       a、首先查看Machin...
  • hanbo622
  • hanbo622
  • 2015年03月28日 18:58
  • 6625

android下调试声卡驱动之概述

在Android中音频系统使用的是ALSA系统架构。ASoC--ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持 嵌入式处理器和移动设备中的音频Codec的一套...
  • hanbo622
  • hanbo622
  • 2015年03月19日 10:45
  • 6757

AudioPolicyManager::getDeviceForStrategy

getStrategy根据StreamType得到Strategy,AudioPolicyManager再从mOutputRoutes里查出Strategy和前面得到的Strategy相等的Route...
  • Damon_X
  • Damon_X
  • 2016年06月14日 09:48
  • 1023

Android新增一个音频类型及双音频输出的实现

android定义了很多种音频类型,完整定义在native层如下,system\core\include\system\audio.h文件中: /* Audio stream types */ ...
  • songche123
  • songche123
  • 2016年01月18日 18:08
  • 4320

Android Audio代码分析26 - Audio Strategy

在看示例代码 testPlaybackHeadPositionIncrease 的时候,我们对 play 函数进行了研究。 不过,当时对 Android 中声音竞争策略相关的内容,并没有详细分析。 ...
  • njuitjf
  • njuitjf
  • 2011年10月25日 18:22
  • 5882

Android音频系统之AudioTrack(二)

1.1.1 AudioPolicyService的路由实现我们在AudioPolicyService小节曾将其比作是一个“路由器”,不过还没有深入解析它是如何完成路由选择的。这部分的功能与使用者——A...
  • uiop78uiop78
  • uiop78uiop78
  • 2013年04月15日 18:30
  • 10192

Android Audio代码分析27 - Strategy 优先级

status_t AudioFlinger::PlaybackThread::Track::start() { status_t status = NO_ERROR; LOGV(...
  • njuitjf
  • njuitjf
  • 2011年11月07日 17:42
  • 5933
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android6.0 framework修改使用两个声卡
举报原因:
原因补充:

(最多只允许输入30个字)