2011年8月25日 星期四

ALSA 音量控制 sample code

以下是一段 ALSA 的程式碼片段,目的是調整某個音效卡的音量。我們會先開啟預設的 mixer,然後列舉所有的控制項並且找出 Master、將音量調整為 100%。

snd_mixer_elem_t* elem = NULL;
snd_mixer_t* mixer;

snd_mixer_open(&mixer, 0);
snd_mixer_attach(mixer, "default");
snd_mixer_selem_register(mixer, NULL, NULL);
snd_mixer_load(mixer);

for(elem=snd_mixer_first_elem(mixer);elem;elem=snd_mixer_elem_next(elem))
{
	if(!strcmp(snd_mixer_selem_get_name(elem), "Master"))
		break;
}

snd_mixer_selem_set_playback_volume_range(elem, 0, 100);  // range : 0 ~ 100
snd_mixer_selem_set_playback_switch_all(elem, 1);

下面的程式碼則是找出錄音來源的控制項並將它切換到編號一所對應的選項。這種控制項和上面的音量控制不同,它沒有百分比計和靜音開關,只能從幾個 options 中挑一個來用。

snd_mixer_elem_t* elem = NULL;
snd_mixer_t* mixer;

snd_mixer_open(&mixer, 0);
snd_mixer_attach(mixer, "default");
snd_mixer_selem_register(mixer, NULL, NULL);
snd_mixer_load(mixer);

for(elem=snd_mixer_first_elem(mixer);elem;elem=snd_mixer_elem_next(elem))
{
	if(!strcmp(snd_mixer_selem_get_name(elem), "Input Source"))
		break;
}

snd_mixer_selem_set_enum_item(elem, SND_MIXER_SCHN_MONO, 1);

2011年8月16日 星期二

PulseAudio 永遠低延遲播放來自線路輸入的訊號

像音效卡的 line-in、麥克風或 SPDIF等訊號輸入,除非你讓音效卡直接輸出錄音,不然平常應該聽不到輸入訊號才對。讓音效卡永遠播放來自錄音裝置的訊號有一些好處,這樣可以把系統播放的聲音和錄音裝置的訊號合在一起。譬如說實況 console game 的時候加入 PC 端播放的音樂,上一篇錄音的文章雖然也可以做到,但是會有只能兩邊挑一個聽的問題,不是聽音樂犧牲音效不然就是聽音效不聽音樂,對玩家來說頗不方便。不過讓音效卡永遠播放來自錄音裝置的訊號也不是沒有缺點,像 SE200PCI 這種麥克風和線路輸入混合的硬體就會有麥克風訊號被播放的問題。

底下的設定請寫到 /etc/pulse/default.pa

load-module module-loopback source=alsa_input.pci-0000_05_07.0.analog-stereo sink=alsa_output.softvol

其中 alsa_intput 是你的錄音裝置,alsa_output 是輸出(播放)裝置。如果播放有延遲的問題,請修改 /etc/pulse/daemon.conf 內的 default-fragment 系列參數。
default-fragments = 8
default-fragment-size-msec = 1