开发板原来跑Android 2.2的系统都正常,但是porting到2.3后,跑起来audio没声音,调试了有两个问题:
1、snd_pcm_write之后,pcm触发都很正常,就是DMA的中断出不来,DMA的地址,音频数据啥的都没问题,不知道DMA的中断还会有什么触发条件吗?2、android启动用logcat,有以下信息:D/AndroidRuntime( 1864): >>>>>> AndroidRuntime START com.android.internal.os.ZygoteInit <<<<<<
D/AndroidRuntime( 1864): CheckJNI is ON
D/dalvikvm( 1864): creating instr width table
I/        ( 1865): ServiceManager: 0xad50
E/ALSALib ( 1865): external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdate) Invalid CTL AndroidOut
W/AudioHardwareALSA( 1865): Unable to attach mixer to device AndroidOut: No such file or directory
E/ALSALib ( 1865): external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdate) Invalid CTL AndroidIn
W/AudioHardwareALSA( 1865): Unable to attach mixer to device AndroidIn: No such file or directory
E/AudioHardwareALSA( 1865): ALSA Module not found!!!
W/AudioHardwareInterface( 1865): Using stubbed audio hardware. No sound will be produced.
D/AudioHardwareInterface( 1865): setMode(NORMAL)
I/CameraService( 1865): CameraService started (pid=1865)
I/AudioFlinger( 1865): AudioFlinger's thread 0xc7e8 ready to run我改了asound.conf文件,增加了AndroidOut和AndroidIn两个设备,还是有以上出错提示。
不知道有没有盆友也碰到这些问题,能提供点解决思路也行,已经快抓狂了。。

解决方案 »

  1.   

    W/AudioHardwareALSA( 1865): Unable to attach mixer to device AndroidIn: No such file or directory
    没找到文件目录?
      

  2.   


    应该是个设备,加载混音设备的时候需要的。但是我已经在asound.conf里添加了,而且之前AndroidPlayback 也是提示同样的问题,加了之后就好了,就是这个AndroidIn和AndroidOut加了还是不行。。郁闷
      

  3.   

    E/ALSALib ( 1865): external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdate) Invalid CTL AndroidIn
    无效CTL
      

  4.   

    E/AudioHardwareALSA( 1865): ALSA Module not found!!! -- 这个咋回事儿?
      

  5.   


    应该是由于log提示的上面两个设备找不到导致的snd_ctl_open_noupdate返回fail了
      

  6.   


    虚设备也有ID呀 木有设备ID上层怎么操作它
      

  7.   

    E/AudioHardwareALSA( 1865): ALSA Module not found!!!
    W/AudioHardwareInterface( 1865): Using stubbed audio hardware. No sound will be produced.
    首先你内核已经有声卡alsa驱动,其次你要移植alsa-lib、alsa_sound到android2.3上,android2.3去掉了alsa hal层。
    具体见:http://blog.csdn.net/sepnic/article/details/6241019
      

  8.   


    谢谢你的回复。你的博文之前看过了,alsa_lib、alsa_sound已经从Google下载最新的,移植好,声卡驱动也改好了。libaudio用alsa_sound编出来,device/samsung里面的那个被我移除了。这样会有问题吗?
      

  9.   

    如果移植好alsa hal层,那么为什么还会“Using stubbed audio hardware”?你最好检查android2.3.1-gingerbread\build\target\board\generic\BoardConfig.mk,这个是board的硬件HAL配置文件,不知道你有没有修改好?
      

  10.   

    可以从AudioFlinger.cpp中的AudioFlinger::AudioFlinger()加些打印找下去,它到底执行哪些分支?或出现了什么错误?
    我怀疑你的BoardConfig.mk没有BOARD_USES_GENERIC_AUDIO为false。
      

  11.   


    BOARD_USES_GENERIC_AUDIO我确定已经是false,因为之前alsa_lib没有移植好,会提示“E/ALSALib ( 1865): external/alsa-lib/src/control/control.c:902:(snd_ctl_open_noupdate) Invalid CTL AndroidPlayback
    在修改了asound.conf,添加了AndroidPlayback就不会有这个错误,但是会有提示无法找到“AndroidOut”。谢谢你的提示,我有在alsa_lib里跟踪过,就是在“snd_ctl_open_noupdate”返回错误了才导致后面的一串错误。AudioFlinger()的代码没有查过,我试试看。
      

  12.   

    与snd_ctl_open_noupdate的错误无关的,因为你没有配置asound.conf文件(见http://blog.csdn.net/sepnic/article/details/6384249),但不会影响应用,这个返回的错误你可以无视。
    关键是你AudioFlinger中的hw = createAudioHardware()有没有执行,有没有出错。
      

  13.   


    有个奇怪的现象,刚开机的时候应该会播放一段开机音乐,这时候看log直接“Entered s3c_dma_hw_free”
    看来播放中断出不来有可能是分配的DMA空间都已经被释放了吧还得去找上层,虾米问题这是
      

  14.   

    你确定你驱动在2.2是OK的吗?如果驱动是正常的,最好还是检查一下你移植的android hal层,android本身应该问题不大。
      

  15.   


    驱动是有移植过,现在就是不确认是驱动本身问题还是kernel有其他的问题导致2.2是用2.6.32的kernel,现在2.3用的是2.6.35。昨天修改后,用2.3的系统在2.6.32 kernel上没问题,但在2.6.35还是播放不出声音。同样的播放流程,35内核会进到 s3c_dma_hw_free ,而32则不会,但这个接口是上层调用的,应该是前面运行有错误,导致调用这个接口的。alsa_lib的文件真够杂的,找的太费劲了
      

  16.   

    那多半是驱动的问题了。如果2.3系统跑在2.6.32的kernel没问题的话。
    不用怀疑alsa-lib,而且alsa-lib绝对比alsa-driver复杂得太多。
    最简单的验证方法:做个ramdisk,跑2.6.35kernel,然后调用aplay播放wav文件。能播放则driver没问题,不能播的话,最好找一下driver。另外我觉得应该不是codec的问题,多半是pcm(即控制dma搬运pcm数据)。
      

  17.   

    const struct file_operations snd_pcm_f_ops[2] = {
    {
    .owner = THIS_MODULE,
    .write = snd_pcm_write,
    .aio_write = snd_pcm_aio_write,
    .open = snd_pcm_playback_open,
    .release = snd_pcm_release,
    .llseek = no_llseek,
    .poll = snd_pcm_playback_poll,
    .unlocked_ioctl = snd_pcm_playback_ioctl,
    .compat_ioctl =  snd_pcm_ioctl_compat,
    .mmap = snd_pcm_mmap,
    .fasync = snd_pcm_fasync,
    .get_unmapped_area = snd_pcm_get_unmapped_area,
    },这个snd_pcm_fasync在什么情况下会被调用?有人碰到过吗?
      

  18.   

    这个方法我有验证过,用2.6.35的kernel是不能播放aplay的。但是直接在android系统里用媒体播放器和用aplay播放,执行的代码是不一样的。aplay用的是android系统里的alsa_lib,而用媒体播放器会用到kernel里的alsa驱动。可以看到这两部分代码有部分是同样功能的。pcm跟踪过了,和正常播放的执行顺序一样,现在估计是有个地方没跟到,返回了错误的值,导致上层调用了snd_pcm_fasync之后就把DMA释放了。
      

  19.   

    你说的帧字节是指这个吗?
    static const struct snd_pcm_hardware s3c_dma_hardware = {
    .info = SNDRV_PCM_INFO_INTERLEAVED |
        SNDRV_PCM_INFO_BLOCK_TRANSFER |
        SNDRV_PCM_INFO_MMAP |
        SNDRV_PCM_INFO_MMAP_VALID |
        SNDRV_PCM_INFO_PAUSE |
        SNDRV_PCM_INFO_RESUME,
    .formats = SNDRV_PCM_FMTBIT_S16_LE |
        SNDRV_PCM_FMTBIT_U16_LE |
        SNDRV_PCM_FMTBIT_U8 |
        SNDRV_PCM_FMTBIT_S8,
    .channels_min = 2,
    .channels_max = 2,
    .buffer_bytes_max = 128*1024,//160*1024,
    .period_bytes_min = PAGE_SIZE, //128,
    .period_bytes_max = PAGE_SIZE*2,//1024,
    .periods_min = 2,// 4,
    .periods_max = 128,//64,
    .fifo_size = 32,//16,
    };
    我现在用的就是35内核里的默认配置,之前也试过用32内核的。你说的编码方式能不能说的具体点?
      

  20.   

    Android刚开机的时候都会执行一次snd_pcm_playback_open() -> s3c_dma_hw_params() -> s3c_dma_prepare() -> snd_pcm_drain()
    用32的内核可以很正常的走完,就等待播放。但是用我移植过的35内核,会多执行snd_pcm_fasync(),之后居然snd_pcm_release() -> s3c_dma_hw_free()
    难怪我DMA的中断一直出不来,刚开机就已经被free了。这个刚开机执行的snd_pcm_playback_open()是在哪里调用的?有人可以给个思路吗?android的代码看的头大。
      

  21.   

    你确定是snd_pcm_playback_open吗?应该是snd_pcm_open,这个是alsa-lib函数,在alsa_default.cpp中调用。
    snd_pcm_fasync()会调用是不是open设置了async模式?
    不过我目前用的是2.6.32的内核,没有遇到这个问题。
    你可以check下2.6.32与2.6.35中的alsa版本变化。alsa版本很大改动的话,alsa-lib可能要用相匹配的版本。ps:我觉得这个可能性不大。
      

  22.   

    在驱动里,是先进到snd_pcm_playback_open,之后会调用snd_pcm_open。我看了传进去的参数确实有带SND_PCM_ASYNC,但是这样在2.6.32的内核也是可以播放的,奇怪。我的Android 2.3已经更新了最新的alsa_lib,用2.2的alsa_lib会跑不起来,不知道是不是和2.6.35内核的alsa驱动不兼容。但2.6.32又可以正常跑,奇怪
      

  23.   

    phone的服务会挂掉,难道是这个导致的?
      

  24.   

    mediaserver服务有没有挂掉?audioflinger有没有挂掉?所以说调试驱动的时候,最好绕开android,不然出了问题就比较难定位到底是哪部分影响的了。做个ramdisk,磨刀不误砍柴工啊,而且以后还会用得着得。
      

  25.   

    现在启动都正常,一播放音乐,mediaservice、music、audio的相关服务全部挂掉了,错误信息如下,不知道是不是那个empty cursor引起的。
    I/ActivityManager( 1914): Starting: Intent { act=android.intent.action.VIEW dat=file:///sdcard/b.wav typ=audio/* flg=0x4000000 cmp=com.android.music/.AudioPreview (has extras) } from pid 2319
    I/MediaPlayerService( 1877): Create new client(1) from pid 2181, url=/sdcard/vb.wav, connId=1, audioSessionId=2
    I/MediaPlayerService( 1877): player type = 4
    I/StagefrightPlayer( 1877): setDataSource('/sdcard/vb.wav')
    W/AudioPreview( 2181): empty cursor
    W/InputManagerService( 1914): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@3dcfe800 (uid=10000 pid=2319)
    I/DEBUG   ( 1874): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    I/DEBUG   ( 1874): Build fingerprint: 'generic/utv210/utv210:2.3.4/GINGERBREAD/eng.chrisx.20110802.151621:eng/test-keys'
    I/DEBUG   ( 1874): pid: 1877, tid: 1877  >>> /system/bin/mediaserver <<<
    I/DEBUG   ( 1874): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
    I/DEBUG   ( 1874):  r0 00000000  r1 00000003  r2 0000ac44  r3 00000001
    I/DEBUG   ( 1874):  r4 0004c8a0  r5 00000003  r6 00000001  r7 00000004
    I/DEBUG   ( 1874):  r8 00000001  r9 0000ac44  10 00000000  fp b68b1a74
    I/DEBUG   ( 1874):  ip a9060054  sp b68b19e0  lr a902dfd3  pc a8214522  cpsr 40000030
    I/DEBUG   ( 1874):  d0  00000000000000a0  d1  00000000000000f0
    I/DEBUG   ( 1874):  d2  0000001000000355  d3  3d55f0900000003d
    I/DEBUG   ( 1874):  d4  0076007200650053  d5  004d006500630069
    I/DEBUG   ( 1874):  d6  00670061006e0061  d7  0000000000720065
    I/DEBUG   ( 1874):  d8  0000000000000000  d9  0000000000000000
    I/DEBUG   ( 1874):  d10 0000000000000000  d11 0000000000000000
    I/DEBUG   ( 1874):  d12 0000000000000000  d13 0000000000000000
    I/DEBUG   ( 1874):  d14 0000000000000000  d15 0000000000000000
    I/DEBUG   ( 1874):  d16 000000000005ab3f  d17 40025f1046ea3bb8
    I/DEBUG   ( 1874):  d18 4000000000000000  d19 bfd2f8823751ddbc
    I/DEBUG   ( 1874):  d20 3f114d8b08ef73f2  d21 bebbaf03b8fe0a0e
    I/DEBUG   ( 1874):  d22 3ff0000000000000  d23 3fe81c5753a017a4
    I/DEBUG   ( 1874):  d24 3e66376972bea4d0  d25 0000000000000000
    I/DEBUG   ( 1874):  d26 0000000000000000  d27 0000000000000000
    I/DEBUG   ( 1874):  d28 0000000000000000  d29 0000000000000000
    I/DEBUG   ( 1874):  d30 0000000000000000  d31 0000000000000000
    I/DEBUG   ( 1874):  scr 20000010
    I/DEBUG   ( 1874): 
    I/ARMAssembler( 1914): generated scanline__00000077:03515102_00000000_00000000 [ 34 ipp] (48 ins) at [0x42aa1768:0x42aa1828] in 0 ns
    I/ActivityManager( 1914): Displayed com.android.music/.AudioPreview: +385ms
    I/DEBUG   ( 1874):          #00  pc 00014522  /system/lib/libbinder.so
    I/DEBUG   ( 1874):          #01  pc 0002dfd0  /system/lib/libmedia.so
    I/DEBUG   ( 1874):          #02  pc 0002e276  /system/lib/libmedia.so
    I/DEBUG   ( 1874):          #03  pc 0001499e  /system/lib/libmediaplayerservice.so
    I/DEBUG   ( 1874):          #04  pc 0004756a  /system/lib/libstagefright.so
    I/DEBUG   ( 1874):          #05  pc 000498f8  /system/lib/libstagefright.so
    I/DEBUG   ( 1874):          #06  pc 0004998e  /system/lib/libstagefright.so
    I/DEBUG   ( 1874):          #07  pc 00018d36  /system/lib/libmediaplayerservice.so
    I/DEBUG   ( 1874):          #08  pc 00014126  /system/lib/libmediaplayerservice.so
    I/DEBUG   ( 1874):          #09  pc 00037a78  /system/lib/libmedia.so
    I/DEBUG   ( 1874):          #10  pc 0001359c  /system/lib/libbinder.so
    I/DEBUG   ( 1874):          #11  pc 000167ba  /system/lib/libbinder.so
    I/DEBUG   ( 1874):          #12  pc 0001699a  /system/lib/libbinder.so
    I/DEBUG   ( 1874):          #13  pc 00008a1c  /system/bin/mediaserver
    I/DEBUG   ( 1874):          #14  pc 00014b52  /system/lib/libc.so
    I/DEBUG   ( 1874): 
    I/DEBUG   ( 1874): code around pc:
    I/DEBUG   ( 1874): a8214500 bd3e9801 6803b537 22004601 466c4668 
    I/DEBUG   ( 1874): a8214510 ab01691d 466847a8 ffd8f7ff bd3e9801 
    I/DEBUG   ( 1874): a8214520 6803b513 aa014601 691c4668 47a02300 
    I/DEBUG   ( 1874): a8214530 b1409800 69516802 f1b04788 d0023fff 
    I/DEBUG   ( 1874): a8214540 19049c01 2400e000 f7ff4668 4620ffbf 
    I/DEBUG   ( 1874): 
    I/DEBUG   ( 1874): code around lr:
    I/DEBUG   ( 1874): a902dfb0 4604b08d f8dd4691 461eb070 0074f89d 
    I/DEBUG   ( 1874): a902dfc0 9f16460d a060f8dd f8db9009 f7fd0000 
    I/DEBUG   ( 1874): a902dfd0 f8dfef9e 44f881b0 f8db4601 91070000 
    I/DEBUG   ( 1874): a902dfe0 ef8ef7fd 46414a68 447a9b07 20059000 
    I/DEBUG   ( 1874): a902dff0 ef14f7fd b1436823 46414a64 f06f2006 
    I/DEBUG   ( 1874): 
    I/DEBUG   ( 1874): stack:
    I/DEBUG   ( 1874):     b68b19a0  00000001  
    I/DEBUG   ( 1874):     b68b19a4  00000000  
    I/DEBUG   ( 1874):     b68b19a8  00000000  
    I/DEBUG   ( 1874):     b68b19ac  afd13ec7  /system/lib/libc.so
    I/DEBUG   ( 1874):     b68b19b0  00000020  
    I/DEBUG   ( 1874):     b68b19b4  00000000  
    I/DEBUG   ( 1874):     b68b19b8  00000001  
    I/DEBUG   ( 1874):     b68b19bc  00000004  
    I/DEBUG   ( 1874):     b68b19c0  00000001  
    I/DEBUG   ( 1874):     b68b19c4  afd144c1  /system/lib/libc.so
    I/DEBUG   ( 1874):     b68b19c8  a9060428  
    I/DEBUG   ( 1874):     b68b19cc  00000000  
    I/DEBUG   ( 1874):     b68b19d0  00000001  
    I/DEBUG   ( 1874):     b68b19d4  a811d443  /system/lib/libutils.so
    I/DEBUG   ( 1874):     b68b19d8  df002777  
    I/DEBUG   ( 1874):     b68b19dc  e3a070ad  
    I/DEBUG   ( 1874): #00 b68b19e0  00000000  
    I/DEBUG   ( 1874):     b68b19e4  00000003  
    I/DEBUG   ( 1874):     b68b19e8  0004c8a0  
    I/DEBUG   ( 1874):     b68b19ec  a902dfd3  /system/lib/libmedia.so
    I/DEBUG   ( 1874): #01 b68b19f0  00000000  
    I/DEBUG   ( 1874):     b68b19f4  a905ffe0  
    I/DEBUG   ( 1874):     b68b19f8  00000003  
    I/DEBUG   ( 1874):     b68b19fc  00000000  
    I/DEBUG   ( 1874):     b68b1a00  a905ffe0  
    I/DEBUG   ( 1874):     b68b1a04  00000003  
    I/DEBUG   ( 1874):     b68b1a08  00000000  
    I/DEBUG   ( 1874):     b68b1a0c  00000001  
    I/DEBUG   ( 1874):     b68b1a10  00000000  
    I/DEBUG   ( 1874):     b68b1a14  00000000  
    I/DEBUG   ( 1874):     b68b1a18  00000000  
    I/DEBUG   ( 1874):     b68b1a1c  a9034a0d  /system/lib/libmedia.so
    I/DEBUG   ( 1874):     b68b1a20  0000000c  
    I/DEBUG   ( 1874):     b68b1a24  0004c8a0  
    I/DEBUG   ( 1874):     b68b1a28  b68b1a74  
    I/DEBUG   ( 1874):     b68b1a2c  00000000  
    I/DEBUG   ( 1874):     b68b1a30  0000ac44  
    I/DEBUG   ( 1874):     b68b1a34  00000001  
    I/DEBUG   ( 1874):     b68b1a38  a2f472c1  /system/lib/libstagefright.so
    I/DEBUG   ( 1874):     b68b1a3c  00000001  
    I/DEBUG   ( 1874):     b68b1a40  00000000  
    I/DEBUG   ( 1874):     b68b1a44  a902e27b  /system/lib/libmedia.so
    W/AudioSystem( 2181): AudioFlinger server died!
    W/IMediaDeathNotifier( 2181): media server died
    E/MediaPlayer( 2181): error (100, 0)
    W/AudioSystem( 1914): AudioFlinger server died!
    W/IMediaDeathNotifier( 1914): media server died
    W/AudioSystem( 1914): AudioPolicyService server died!
    I/ServiceManager( 1871): service 'media.audio_flinger' died
    I/ServiceManager( 1871): service 'media.player' died
    I/ServiceManager( 1871): service 'media.camera' died
    I/ServiceManager( 1871): service 'media.audio_policy' died
    W/MediaMetadataRetriever( 2083): MediaMetadataRetriever server died!
    I/AudioService( 1914):  AudioFocus  requestAudioFocus() from android.media.AudioManager@3dae83f0com.android.music.AudioPreview$2@3dade3f8
    E/MediaPlayer( 2181): Error (100,0)
      

  26.   

    楼主,snd_pcm_fasync被调用的问题怎么解决的,是RTC的问题?
      

  27.   


    恩,可能是clock那里有点问题,导致一些服务出错,挂掉了。
      

  28.   

    我本来是想用alsa里自带的aplay播放音频测试,这样就和android没有关系了,但是现在才发现android的那些服务起来了以后,aplay不能播放了。。郁闷!
      

  29.   

    那是因为android起来后,audio设备已经打开了,aplay不能再次open。
    一般来说,公司驱动组都会做好纯linux(基于busybox)的调试环境的啊,如果没有,自己做一个也不会太麻烦。
      

  30.   

    ramdisk可能要搭一个才行了,现在跑35的kernel好像在android层也会有个错误,不知道是什么原因。W/InputManagerService( 1898): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@3db14198 (uid=10000 pid=2221)
    W/AudioPreview( 2212): empty cursor这个两个是用32内核播放音乐,不会提示的错误。
      

  31.   

    查来查去,是DMA驱动的问题faint声音出来了,但是很模糊,还得细调