ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2014年7月28日 星期一

AudioPolicyManagerBae : loadAudioPolicyConfig() loaded /system/etc/audio_polocy.conf

2014年7月11日 星期五

基本上就是 MIXER.
然後每個 可以/需要 控制的地方,都是一個 widget

然後用 route {out, sw, in} 把 widget 間的 routing 關係描述出來。

這一篇 說明得很好。
怎麼從一堆 route elem 中,把你要的 path (routing) 找出來。

就是依照 in - out 把你要的 path 繞出來。
最後把 path 中, sw 不是 NULL的寫下來。
這就是 asound.conf 要的 hook_args[ ]

playback 已經 OK.

以下就用 Capture 作測試:

Capture 就是:
  • IN : MIC
  • OUT : I2S
首先要開啟 alsa-lib 的 debug message : SND_ERR

在 project 的 include/config.h ..
#ifndef NDEBUG
#define NDEBUG
#endif
把這三行 comment 掉。

之後 logcat 就可以看到..
ALSALib( ): external/lib-alsa/src/control/setup.c:565:(add_elem) Cannot obtain infor for CTL elem (MIXER,'Speaker Switch'
,0,0,0): No such file or directory
開啟了 之後,asound.conf 內容如果有錯,會有 error 顯示出來。

2014年7月10日 星期四

snd_kcontrol_new     : snd_soc_add_controls( )
snd_soc_dapm_widget  : snd_soc_dapm_new_controls( )
snd_soc_dapm_route   : snd_soc_dapm_add_routes( )
widget 裡有:
  • SUPPLY
  • VMID
  • MICBIAS
  • INPUT
  • OUTPUT
  • PGA
  • PGA_E
  • MIXER
  • ADC
  • DAC
  • MUX
  • MUX_E
  • AIF_IN
  • AIF_OUT
  • SWITCH
struct snd_kcontrol_new {
  snd_ctl_elem_iface_t iface; /* interface identifier */
  unsigned int device;  /* device/client number */
  unsigned int subdevice;  /* subdevice (substream) number */
  unsigned char *name;  /* ASCII name of item */
  unsigned int index;  /* index of item */
  unsigned int access;  /* access rights */
  unsigned int count;  /* count of same elements */
  snd_kcontrol_info_t *info;
  snd_kcontrol_get_t *get;
  snd_kcontrol_put_t *put;
  union {
  snd_kcontrol_tlv_rw_t *c;
  const unsigned int *p;
  } tlv;
  unsigned long private_value;
};

struct soc_mixer_control {
 int min, max, platform_max;
 unsigned int reg, rreg, shift, rshift, invert;
}

static const struct snd_kcontrol_new rt5625_snd_controls[] = {
        ...
 SOC_DOUBLE("Headphone Playback Switch", RT5625_HP_OUT_VOL,
   RT5625_L_MUTE_SFT, RT5625_R_MUTE_SFT, 1, 1),
        ...
};

#define SOC_DOUBLE(xname, xreg, shift_left, shift_right, xmax, xinvert) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
 .put = snd_soc_put_volsw, \
 .private_value = (unsigned long)&(struct soc_mixer_control) \
                 {
                   .reg = xreg, .shift = shift_left, .rshift = shift_right, \
                   .max = xmax, .platform_max = xmax, .invert = xinvert    \
                 }                                                         \
}

/*
 * DAPM audio route definition.
 *
 * Defines an audio route originating at source via control and finishing
 * at sink.
 */
struct snd_soc_dapm_route {
 const char *sink;
 const char *control;
 const char *source;

 /* Note: currently only supported for links where source is a supply */
 int (*connected)(struct snd_soc_dapm_widget *source,
    struct snd_soc_dapm_widget *sink);
};

2014年7月9日 星期三

notes : android and alsa conf

alsa 和 android 的介面好像是靠 一個 conf 決定的。
有些說是 alsa.conf ,有些說是 asound.conf
在 android 4.2,是 /usr/share/alsa/alsa.conf 裡指定了 /etc/asound.conf

這個系統是在 /etc/asound.conf

這個檔案是在 /rootfs/rootdir/etc/ 下。
這是一個 prebuild folder, 該 file 也是預先寫定。
在 build system 時,rootdir 的內容會被整個 copy 到最後 image 的 root/ 中。

也就是說,實際系統的 /etc/asound.conf 就是這裡來的。


android 设置Audio Path 根据 getStrategy(stream_type) 和 getDeviceForStrategy() 取出對應的输出、输入,
然後 call setOutputDevice(mHardwareOutput, newDevice)
他會 call alsa_default.cpp
然後 會用到 s_route, s_open 控制到底層。

s_open 利用 deviceName(handle, devices, mode)
依照 Devices 動態組合出path字串,
用 snd_pcm_open( ) 依照 asound.conf 設定檔的 pcm 裡的 controls

所以 logcat 時可以看到:
D/AudioHardwareALSA(  674): openOutputStream called for devices: 0x00000002
I/ALSAModule(  674): s_close AndroidPlayback
D/ALSAModule(  674): open called for devices 00000002 in mode 0, channel 2...
E/ALSAModule(  674): s_open: AndroidPlayback_Speaker_normal
E/ALSALib (  674): external/alsa-lib/src/control/setup.c:565:(add_elem) Cannot obtain info for CTL elem (MIXER,'Speaker Switch',0,0,0): No such file or directory
E/ALSAModule(  674): s_open: AndroidPlayback_Speaker
E/ALSALib (  674): external/alsa-lib/src/control/setup.c:565:(add_elem) Cannot obtain info for CTL elem (MIXER,'Speaker Switch',0,0,0): No such file or directory
E/ALSAModule(  674): s_open: AndroidPlayback
D/ALSAModule(  674): force handle channels to 2
D/ALSAModule(  674): Set 48000 , handl channel 2
D/ALSAModule(  674): Set PCM format to S16_LE (Signed 16 bit Little Endian)
D/ALSAModule(  674): Using 2 channels for stream.
D/ALSAModule(  674): Set stream sample rate to 48000 HZ
D/ALSAModule(  674): Buffer size: 4096
D/ALSAModule(  674): Latency: 85333
I/ALSAModule(  674): Initialized ALSA PLAYBACK device AndroidPlayback_Speaker_normal
Error 是因為我改了 codec kcontrol name...

2014年7月1日 星期二

usbmon -- usb sniffer for linux

usbmon 是一個 kernel module.
要啟動 debugfs 的 support 才能使用。

kernel 起來後,mount /sys/kernel/debugfs
usb mon 就會在 裡面。

然後 cat XXX 就會把 usb 內容都log 出來。

詳細可以google 一下 usbmon 就可以。
也可以直接看 kernel document

...偷看其他人的 protocol 時很好用...

標籤

網誌存檔