Страница 1 из 2

Кіраванне гучнасцю кольцам мышані

Добавлено: 16 июн 2006, 18:47
Victor Gr.
Прывітанне :)

Навучыўся рабіць клавіятурныя ды мышыныя біндынгі і ўзналося такое пытанне: як жа кіраваць гучнасцю ALSA?

Мне хочацца кіраваць гучнасцю кольцам мышані (разам з якой-небудзь пімпай, напрыклад Windows).

Знайшоў нават праграму amixer, якой можна кіраваць гучнасцю, але яна не падтрымлівае інкрымент ды дыкрымент, а толькі пэўную лічбу ў адсотках.

Мабыць ёсць праграма, якая робіць нешта накшталт "volume +5%"?

Але я не знайшоў, таму прыйшлося пісаць скрыпт на Perl-е.

Код: Выделить всё

#!/usr/bin/perl
use strict;

my $what_todo = $ARGV[0];  # inc | dec | on_off
my $delta     = 5;         # in percent
my $control   = 'PCM';     # volume control

my $current_volume = qx/amixer get $control/;
   $current_volume =~ m/.*\[(\d*)%\] \[(on|off)\].*/;
   $current_volume = $1;
my $current_state  = $2;

my $new_volume;

if ($what_todo eq 'inc') {

        $new_volume = $current_volume + $delta;

} elsif ($what_todo eq 'dec') {

    if ($current_volume >= $delta) {

        $new_volume = $current_volume - $delta;

    } else {

        $new_volume = 0;

    }

} elsif ($what_todo eq 'on_off') {

    if ($current_state eq 'off') {
        $new_volume = 'on';
    } elsif ($current_state eq 'on') {
        $new_volume = 'off';
    }

}

system ("amixer sset $control $new_volume%");
Ён быў названы volume.pl і размешчаны ў /usr/local/bin.
А біндынг у .xbindkeysrc такі:

Код: Выделить всё

# increase volume
"volume.pl inc"
    m:0x50 + c:115 + b:4 (mouse)
    Mod2+Mod4 + Super_L

# descrease volume
"volume.pl dec"
    m:0x50 + c:115 + b:5 (mouse)
    Mod2+Mod4 + Super_L

# turn on or off mute
"volume.pl on_off"
    m:0x10 + c:110
    Mod2 + Pause
Усё працуе, але ёсць пытанні. Пры рэзкім кручэнні кольца гучнасць скоча то ўверх, то ўніз. Здаецца, гэта адбываецца з-за таго, што запускаюцца адразу некалькі працэсаў volume.pl, якія несінхранізуюцца паміж сабой і атрымліваюць розныя значэнні amixer get $control.

Як з гэтым змагацца? Ці якія іншыя сродкі вырашэння гэтай праблемы існуюць?

Дзякуй!

Добавлено: 16 июн 2006, 20:18
nab
Дадай стварэньне lock-файла, калі ён існуе, тады не зьмяняць гучансьць

Добавлено: 16 июн 2006, 20:47
Victor Gr.
nab, гм, мабыць і так.

Пакуль паставіў біндынг на Ctrl+PageUp/Down. Усё добра, і зручна.

А з lock-файлам паспрабую. Толькі мне здаецца, занадта шмат рэсурсаў ускладаецца на гэтую падзею (кручэнне кольца мышані).

Добавлено: 17 июн 2006, 14:17
Berserker
Мне хапае

Код: Выделить всё

key "Ctrl+Alt+a" /usr/bin/xmms-shell -e +
key "Ctrl+Alt+z" /usr/bin/xmms-shell -e -
для рулявання гукам і плагіна xmms-osd-plugin , які адлюстроўвае бягучы ўзровень гука пры яго змяненні.

Добавлено: 17 июн 2006, 17:00
Victor Gr.
Berserker, xmms для xmms-shell навінен быць запушчаны?

Добавлено: 17 июн 2006, 17:25
Berserker
Victor Gr. писал(а):Berserker, xmms для xmms-shell навінен быць запушчаны?
Каб ад xmms-shell быў нейкі эфект - так.

Проста мне патрабуецца мяняць узровень гука ў двух праграмах - xmms і mplayer. У першай гэта робіць xmms-shell , у другой - кнопкі */.

Добавлено: 18 июн 2006, 16:37
Llama
Victor Gr., напісаў бы ты пра гэта ў wiki хоць як...? А то докаў пра такія рэчы амаль што няма...

Добавлено: 18 июн 2006, 16:53
bobrik
Навошта my() у такой праграме?

Добавлено: 18 июн 2006, 19:27
Victor Gr.
bobrik, "эта привычка выработалась у него с годами" (с). :)

Llama, можна, але трэба будзе вырашыць нейкія пытанні, як казаў nab, рабіць lock-файл.

Я яшчэ дадаў osd_cat, каб глядзець узровень гучнасці, але вось якая праблема: новы ўзровень гучнасці накладваецца на папярэдні... Як бы экран чысціць ад osd_cat?

Добавлено: 18 июн 2006, 19:28
Llama
bobrik, my увогуле непатрэбна - але - good code style

Добавлено: 18 июн 2006, 22:21
bobrik
Напэуна трэба выкарыстоуваць дэструктар, але трэба глядцець па модулю, мыбыць ён сам памрэ пастя выхаду з праграммы.
Аб лок-файле, у пачатак праграмы:

Код: Выделить всё

$locked = 'no';
opendir(LOCK, '/tmp');
@files = readdir(LOCK);
close(LOCK);
foreach(@files){
	if($_ eq 'volctl.lock'){
		die;
	}
}
`touch /tmp/volctl.lock`;
И у пачатак:

Код: Выделить всё

`rm /tmp/volctl.lock`;

Добавлено: 18 июн 2006, 22:53
Berserker
И у пачатак:

Код: Выделить всё

`rm /tmp/volctl.lock`;
unlink юзаць веравызначэнне не дазваляе :)

Добавлено: 18 июн 2006, 23:35
Victor Gr.
Пачаў перакладаць гэты Perl-скрыпт на SH-скрыпт. Бо нічога там такога, з-за чаго трэба выкарыстоўваць менавіта Perl, няма. А пры першым выкарыстанні (змене гучнасці) усёж такі заўважна, як падгружаецца магутны Perl.

Але я ніколі не працаваў з не Perl-падобнымі рэгулярнымі выразамі.

Ці можа хтосьці дапамагчы перакласьці радок?
$current_volume =~ m/.*\[(\d*)%\] \[(on|off)\].*/;

Ён патрэбен каб атрымліваць бягучую гучнасць і стан (уключан ці выключан).

У $current_volume

Код: Выделить всё

Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 31
  Mono:
  Front Left: Playback 20 [65%] [on]
  Front Right: Playback 20 [65%] [on]
У $1 і $2 заносяцца ўзровень гука (65) і стан (on) адпаведна.

А як выказаць гэтае ж самае на шэл-скрытцінге не ведаю.

Калі вырашым пытанні з osd_cat можна будзе выкладваць гатовы ўзор скрыпта кіравання гучнасцю.

Добавлено: 18 июн 2006, 23:45
Victor Gr.
bobrik, у Perl праверыць файл на наяўнасць можна і лягчэй.

if (-e "/var/lock/volume.ctl") {}

У BASH я б прапанаваў так:

if [ -f /var/lock/volumectl.lock ] then
echo "Файл існуе";
fi

Вось, ну, а калі ён існуе, дык нічога не рабіць, а калі не існуе - ствараць і змяняць гучнасць. А ў канцы - выдаляць яго.

Добавлено: 19 июн 2006, 01:41
Berserker
Трымай, гэта не shell, але ўсё хутчэй, чым перл:

Код: Выделить всё

fuck@berserker:~$ eval `cat mix | sed -n 's@.*Front \(.*\)\: Playback 20 \[\([0-9]*\)\%\] \[\(.*\)\].*@\1VOLUME=\2\n\1MODE=\3@p'` ; echo $LeftVOLUME $LeftMODE $RightVOLUME $RightMODE
65 on 65 on