我們的系統 ,都使用 ASLA 聲音系統 , 只有 Flash 使用 OSS .
結果 , aplay , fsplay 都可以正確播放聲音 , 只有 Falsh 會有問題 .
聲音 ,影像都卡卡的 .
一開始懷疑 LCD 的 format 格式不對 (之前是 888 , 現在是 565 ) 的問題 ,
找了半天發現 , 只要關閉聲音輸出 , 影像就會很流暢 . 所以又開始懷疑 CPU 不夠力.
經過測試 , 一邊播放 MP3 音樂 , 同時播放 沒有聲音的 flash , 兩者也能很流暢的播放.
想一想也對 , 之前 ARM 9 都可以很順暢 , 沒道理 Cortex-A8 會卡卡的 , 應該OSS Driver 有問題.
我將 DirectFB FusionSound 掛載 OSS 的 driver . 發現 fsplay 就會卡卡的 ,並且聲音輸出怪怪的. 確定OSS Driver 有問題.
我將 fusionsound OSS 的 so 檔移除 , 讓 fsplay 去使用alsa , 就會很正常.
/lib/directfb-1.3-0/snddrivers/libfusionsound_alsa.so libfusionsound_oss.bad libfusionsound_wave.so
經過觀察 ARM 9 和 iMX51 的 asound hw_params 發現 ASLA 的 buffer_size 太小 (如下),
動手修改 /linux/sounc/soc/imx/imx-pcm.c 後舊可加大 buffer_size , 並且 要關閉CONFIG_SND_MXC_SOC_IRAM . 不過還是沒有用 .
//=> /linux/sounc/soc/imx/imx-pcm.c 修改內容.
static const struct snd_pcm_hardware imx_pcm_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_S24_LE,
#ifdef CONFIG_SND_MXC_SOC_IRAM
.buffer_bytes_max = SND_RAM_SIZE,
.period_bytes_max = SND_RAM_SIZE / 4,
#else
.buffer_bytes_max = 128 * 1024,
.period_bytes_max = 64 * 1024,
#endif
.period_bytes_min = 2 * SZ_1K,
.periods_min = 2,
.periods_max = 255,
.fifo_size = 0,
};
//=> 修改之前的 hw_params
cat /proc/asound/card0/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 22050 (22050/1)
period_size: 2048
buffer_size: 4096
OSS format: S16_LE
OSS channels: 2
OSS rate: 22050
OSS period bytes: 1024
OSS periods: 2
OSS period frames: 2048
//=> 修改之後的 hw_params
cat /proc/asound/card0/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 22050 (22050/1)
period_size: 2048
buffer_size: 32768
OSS format: S16_LE
OSS channels: 2
OSS rate: 22050
OSS period bytes: 8192
OSS periods: 16
OSS period frames: 2048
尋找了兩天 , 發現 ASLA 只會設定一次 hw_params , OSS 卻會設定很多次 hw_params ,
並且在 /linux/sounc/soc/imx/imx-3stack-sgtl5000.c 的 imx_3stack_audio_hw_params() 中有一個旗標 , 讓hw_params只能設定一次 , 哇咧....難怪 OSS Driver 都怪怪的.
Mark 掉 下列兩行 , Flash player 可以正確 working 了..... !
static int imx_3stack_audio_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
unsigned int channels = params_channels(params);
u32 dai_format;
/* only need to do this once as capture and playback are sync */
// if (priv->hw)
// return 0;
priv->hw = 1;
#if defined(CONFIG_MXC_ASRC) || defined(CONFIG_MXC_ASRC_MODULE)
if ((asrc_ssi_data.output_sample_rate != 0)
呼....困惑我 3 天的東西終於可解決了 , 下一步 .... Video player 支援 565 LCD format .....