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

Форум предназначен для новичков. В нем предполагается рассматривать вопросы, которые встают на первых этапах освоения Linux
Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

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

Сообщение 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.

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

Дзякуй!

Аватара пользователя
nab
Фанатеющий
Сообщения: 159
Зарегистрирован: 07 май 2004, 21:42
Откуда: Сталіца

Сообщение nab »

Дадай стварэньне lock-файла, калі ён існуе, тады не зьмяняць гучансьць
Изображение

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

nab, гм, мабыць і так.

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

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

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение Berserker »

Мне хапае

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

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

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

Berserker, xmms для xmms-shell навінен быць запушчаны?

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение Berserker »

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

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Victor Gr., напісаў бы ты пра гэта ў wiki хоць як...? А то докаў пра такія рэчы амаль што няма...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
bobrik
Неотъемлемая часть форума
Сообщения: 313
Зарегистрирован: 17 авг 2005, 12:42
Откуда: Витебск
Контактная информация:

Сообщение bobrik »

Навошта my() у такой праграме?
http://bobrik.name - я не вар'ят

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

bobrik, "эта привычка выработалась у него с годами" (с). :)

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

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

bobrik, my увогуле непатрэбна - але - good code style
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
bobrik
Неотъемлемая часть форума
Сообщения: 313
Зарегистрирован: 17 авг 2005, 12:42
Откуда: Витебск
Контактная информация:

Сообщение 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`;

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение Berserker »

И у пачатак:

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

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

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение 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 можна будзе выкладваць гатовы ўзор скрыпта кіравання гучнасцю.

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

bobrik, у Perl праверыць файл на наяўнасць можна і лягчэй.

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

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

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

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

Berserker
Неотъемлемая часть форума
Сообщения: 279
Зарегистрирован: 23 апр 2005, 21:13
Откуда: minsk

Сообщение 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

Ответить