将Widora-NEO作为pulseaudio网络声音播放端

可以将widora-neo作为pulseaudio网络声音播放端, 在ubuntu上实现节目播放和音量调控, 步骤如下:

  1. 在widora-neo上安装 pulseaudio-daemon, pulseaudio-profiles, pulseaudio-tools 模块.

  2. 在 /etc/init.d/pulseaudio 中增加如下内容:

	......
	USE_PROCD=1
	PROG=/usr/bin/pulseaudio

	##----- additional -----
	chown -R :51 /dev/snd
	chmod -R g+rw /dev/snd

	start_service() {
	......
 (如有必要再执行 chmod 777 /dev/snd  和 chmod 777 /dev/snd/* )
  1. 修改 /etc/pulse/system.pa文件,在最后增加:
    ##--- additional ----
    load-module module-alsa-sink device=hw:0         (注:如果选用第2个声卡,那么 device=hw:1, 或则用alsa的mixer:  device =dmix )
    load-module module-native-protocol-tcp auth-anonymous=1
  1. 重新启动pulseaudio: /etc/init.d/pulseaudio restart

  2. 在ubuntu系统上:
    5.1 pulseaudio通常是系统启动后自动加载运行的,也可以手工运行:pulseaudio --start, 然后就可以连接widora-neo上的pulseaudio声音服务了。
    5.2 执行命令:
    pacmd load-module module-tunnel-sink server=192.168.3.24 (widora-neo的IP)
    5.3 打开ubuntu的系统声音设置,就可以看到多了一个名为192.168.3.24的声卡,选择这个声卡。 在ubuntu上运行一个或多个播放器(gnome-mplayer, clementine, rhythmbox等都可以), 就可以在widora-neo这端听到声音了。
    5.4 如果在/etc/pulse/client.pa 文件中增加:default-server = 192.168.3.24, 那么ubuntu系统开机时就会自动将远程pulseaudio端作为默认的声卡了。

  3. 在使用widora-neo自带的声卡时如果有杂音,可以在widora-neo端适当减小音量,或打开/usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common 文件, 将里面的volume = merge 修改成 volume=ignore (server和client端都要做? 似乎无用) , 再重启动一下pulseaudio 。
    秘籍: 在widora-neo端同时运行mplayer,杂音会消失。
    终极秘籍: /etc/pulse/system.pa中将load-module module-alsa-sink device=hw:0 修改成 load-module module-alsa-sink device=dmix (可以尝试下在/etc/asound.conf增加buffer_size 等)
    最后一招: 先清cache: echo 3 > /proc/sys/vm/drop_caches 再执行:mplayer -ao alsa
    可能不同的声卡情况不同,我用usb声卡就没有杂音。在widora-neo本地播放音乐用自带的声卡也没有杂音,推断应该是pulseaudio的配置或者其与alsa接口引起的。

  4. 发现与Ubuntu的rhythmbox配合得比较好。有的播放器在偶尔断网恢复后无法继续播放了。

  5. 如果想在ubuntu端通过话筒喊话,执行 arecord | aplay 命令,再选择aplay的输出对象即可。
    !

  6. 同样可以从widora的mic处回传监听声音,只要在system.pa中加入dsnoop,象下面这样:

   ### --- additional ----
   load-module module-alsa-source device=dsnoop
   load-module module-alsa-sink device=dmix
   load-module module-native-protocol-tcp auth-anonymous=1

在ubuntu端执行如下命令, 先后连接widora_neo上的source和sink服务:

   pacmd load-module module-tunnel-source  server=192.168.3.24  
   pacmd load-module module-tunnel-sink  server=192.168.3.24 

这样设置后就可以进行双向同时传输了!
!

以上设置可以参考:
https://wiki.openwrt.org/doc/howto/pulseaudio
https://wiki.archlinux.org/index.php/PulseAudio_

成功后就可以在ubuntu上实现定点播放了…
!


!1522458911270-widora_pulse2.jpg

遗憾的是目前仅linux系统对pulseaudio网络声音服务有较好的支持,andriod手机上还缺少相关应用。如果有Ubuntu Phone就很值得尝试一下了!

注意:

  1. 网络必须保证双向通畅,如果网络不流畅的话, pulseaudio服务端会连不上或中途掉线, 这时候ubuntu端需要重连, widora端也可能需重启pulseaudio服务。
  2. server端pulseaudio可能与声卡支持的采样率有关?? 比如声卡只支持44.1k的采样率,那么client端的mplayer播放时候需要重采样到44.1k, mplayer -ao pulse -srate 44100 mms://218.28.9.99/gushi, 不然mplayer会报错。 这个现象仅碰到过一次。
  3. 选择widora_mode client 模式比较好。
  4. 只要widora上的pulseaudio不退出,ubuntu上的pulseaudio就会一直发音频数据给widora,即使widora没有被ubuntu选择为当前播放器。
    !

编译pulseaudio之前将 feeds/packages/sound/pulseaudio/Makefile文件中的 --disable-dbus 和 --disable-bluez 注释掉, 杂音似乎消失了。。。

下面是在 Widora Openwrt环境下 使用pulseaudio的一点心得到:

编译之前将 feeds/packages/sound/pulseaudio/Makefile文件中的 --disable-dbus 和 --disable-bluez 选项注释掉。

1. /etc/pulse/system.pa 下面的必须注释掉,不然pulse无法启动。

## Automatically load driver modules depending on the hardware available
#.ifexists module-detect.so
### Use the static hardware detection module (for systems that lack udev/hal support)
#load-module module-detect
#.endif

### Load several protocols
#.ifexists module-esound-protocol-unix.so
#load-module module-esound-protocol-unix
#.endif
#load-module module-native-protocol-unix

2. /etc/pulse/default.pa 配置
2.1 下面的必须注释掉,不然pulse无法以daemon方式启动,出现pa_context_connect fail 错误

### If autoexit on idle is enabled we want to make sure we only quit
### when no local session needs us anymore.
#.ifexists module-console-kit.so
#load-module module-console-kit
#.endif

2.2 下面的必须保留

### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix

### Network access (may be configured with paprefs, so leave this commented
### here if you plan to use paprefs)
load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp

### Automatically suspend sinks/sources that become idle for too long
load-module module-suspend-on-idle

3. system.pa add following 配置:

   ### --- additional ----
   load-module module-alsa-source device=dsnoop
   load-module module-alsa-sink device=dmix
   load-module module-native-protocol-tcp auth-anonymous=1

4. paplay和pacmd命令都需要pulseaudio运行在session daemon模式下.
运行: pulseaudio -D --exit-idle-time=-1
其中 --exit-idle-time=-1 是为了防止pulseaudio在播放中途莫名其妙地自己退出。
pulseaudio 运行后要等到 wm8960_preinit 出现后才可以 运行paplay 和 pacmd !!! PULSE其实是在后台调度ALSA, 所以感觉启动速度相对较慢。

root@Widora:/etc/pulse# pulseaudio -D --exit-idle-time=-1
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
[ 3812.460000] ****** wm8960_postinit ******
[ 3812.480000] playback free_dma_buffer
[ 3812.480000] ptri2s_config->mmap_index:8
[ 3812.580000] capture free_dma_buffer
[ 3812.590000] ptri2s_config->mmap_index:8
root@Widora:/etc/pulse# [ 3817.720000] ummap MMAP[8]=0x85DE0000
[ 3817.720000] capture free_dma_buffer
[ 3817.730000] ptri2s_config->mmap_index:16
[ 3817.730000] ****** wm8960_preinit ******
[ 3818.280000] ummap MMAP[0]=0x85DA0000
[ 3818.280000] playback free_dma_buffer
[ 3818.290000] ptri2s_config->mmap_index:16
root@Widora:/etc/pulse# paplay --raw /home/xx.wav --rate=48000
[ 3825.250000] ****** wm8960_postinit ******
[ 3825.270000] playback free_dma_buffer
[ 3825.270000] ptri2s_config->mmap_index:16
root@Widora:/etc/pulse# [ 3838.110000] ummap MMAP[0]=0x85DA0000
[ 3838.110000] playback free_dma_buffer
[ 3838.120000] ptri2s_config->mmap_index:8

5. paplay 运行PCM raw文件时需要指定rate
比如 :
paplay --raw /home/xx.wav --rate=48000
不然,声音会失真,并且会抛出错误。
而pacmd可以直接播放PCM raw,比如:
pacmd play-file /home/xx.wav 0
这个应该与ALSA和PULSE的默认采样率配置相关。

6 以/etc/init.d/pulseaudio 运行的pulse daemon无法用./pulseaudio stop命令退出,只能用killall -9 pulseaudio.
这个具体要看init.d下的脚本命令。