2015-03-30 4 views
3

Недавно я попал в XMonad, и, к счастью, я совсем не знаю Haskell. Я пытаюсь настроить файл xmonad.hs таким образом, чтобы я мог управлять томом. Однако прямо сейчас, хотя мой файл xmonad.hs компилируется без ошибок, я не могу управлять томом.Конфигурация громкости XMonad не работает

Я получил код управления громкостью по этой ссылке: http://dmwit.com/volume/

Вот мой конфигурационный файл:

import XMonad 
import XMonad.Util.Run(spawnPipe) 
import XMonad.Hooks.DynamicLog 
import XMonad.Hooks.ManageDocks 
import XMonad.Actions.Volume 
import XMonad.Util.Dzen 
import Data.Map (fromList) 
import Data.Monoid (mappend) 
import System.IO 

alert = dzenConfig centered . show . round 
centered = 
     onCurr (center 150 66) 
    >=> font "-*-helvetica-*-r-*-*-64-*-*-*-*-*-*-*" 
    >=> addArgs ["-fg", "#80c0ff"] 
    >=> addArgs ["-bg", "#000040"] 

main = do 
     xmproc <- spawnPipe "xmobar /home/david/.xmobarrc" 
     xmonad $ defaultConfig 
       { 
         manageHook = manageDocks <+> manageHook defaultConfig 
         , layoutHook = avoidStruts $ layoutHook defaultConfig 
         , logHook = dynamicLogWithPP xmobarPP 
           { ppOutput = hPutStrLn xmproc 
           , ppTitle = xmobarColor "green" "" . shorten 50 
           } 
         , modMask = mod4Mask 
         , keys = 
          keys defaultConfig `mappend` 
          \c -> fromList [ 
           ((0, xK_F6), lowerVolume 4 >>= alert), 
           ((0, xK_F7), raiseVolume 4 >>= alert) 
          ] 
       } 

Я изменил мой код следующий, однако объем не изменился:

main = do 
    xmproc <- spawnPipe "xmobar /home/luren/.xmobarrc" 
    xmonad $ defaultConfig 
      { 
        manageHook = manageDocks <+> manageHook defaultConfig 
        , layoutHook = avoidStruts $ layoutHook defaultConfig 
        , logHook = dynamicLogWithPP xmobarPP 
          { ppOutput = hPutStrLn xmproc 
          , ppTitle = xmobarColor "green" "" . shorten 50 
          } 
        , modMask = mod4Mask 
        , keys = 
         keys defaultConfig `mappend` 
         \c -> fromList [ 
          ((0, 0x1008FF11), spawn "amixer -D pulse sset Master 4-"), 
          ((0, 0x1008FF13), spawn "amixer -D pulse sset Master 4+") 
         ] 
      } 

(END)

Эти ключи являются коды для громкоговорителей на моем ноутбуке.

Я просмотрел и увидел другие конфигурации. Я решил сделать небольшой тест и сделать аудио более низкий уровень громкости ключ Привет, ppl! при нажатии. К сожалению, это не работает.

main = do 
    xmproc <- spawnPipe "xmobar /home/luren/.xmobarrc" 
    xmonad $ defaultConfig 
      { 
        manageHook = manageDocks <+> manageHook defaultConfig 
        , layoutHook = avoidStruts $ layoutHook defaultConfig 
        , logHook = dynamicLogWithPP xmobarPP 
          { ppOutput = hPutStrLn xmproc 
          , ppTitle = xmobarColor "green" "" . shorten 50 
          } 
        , modMask = mod4Mask 
      } 
      `additionalKeys` 
      [ 
        ((0, xF86XK_AudioLowerVolume), spawn "echo 'Hi ppl!'"), 
        ((0, xF86XK_AudioRaiseVolume), spawn "amixer -D pulse sset Master 15%+") 
      ] 
+0

Yikes, прошло уже с тех пор, как я написал эту страницу! Я бы не удивился, если с этого момента выход 'amixer' изменился несовместимым образом. (Я перешел из ALSA в импульс.) Но, чтобы проверить: если вы привязываете какой-то ключ к 'getVolume >> = alert', показывает ли он правильный ответ? Изменяет ли ваш объем тома в командной строке с помощью 'amixer'? Какой канал в 'alsamixer' (если есть) действительно правильно контролирует ваш том? –

+0

О, ничего себе! Ты на самом деле написал эту страницу! Я связал ключ, как вы сказали, и, к сожалению, ничего не появляется. Прошу прощения, если для меня это новичок, но я не понимаю, что такое alsa или пульс. Я знаю, что если я использую следующую команду в терминале, amixer -D pulse sset Master 15%, я могу установить том. Что касается канала в alsamixer, я не уверен, что это значит. Я побежал alsamixer, который привел меня к трем s/pdif. Я думаю, что это означает цифровой интерфейс Sony/Philips. – mrQWERTY

+0

А, к сожалению, этот модуль не поддерживает управление определенным устройством (и не имеет возможности вручную манипулировать командной строкой 'amixer'). У вас есть пара вариантов: скопируйте код из модуля и исправьте его (работа 10 секунд, но не пригодная для использования другими); patch 'xmonad-extras', чтобы добавить эту функциональность (немного больше работы, но я с радостью включу ваш патч, а другие смогут извлечь выгоду); используйте 'pacmd' вместо того, чтобы касаться' amixer' вообще (гораздо больше работы, если вы хотите отображать экран на экране после его изменения). О чем вы хотите больше узнать? –

ответ

3

Вот сценарий, который я написал для управления громкостью звука пульса. Дамп его в файл с именем pulse_control.pl и убедитесь, что он выполним и в вашем PATH. Он использует pacmd и pactl, которые вам, возможно, придется устанавливать с помощью менеджера пакетов вашего дистрибутива.

#!/usr/bin/perl 

use List::Util qw[min max]; 
use Getopt::Long; 

my $_IS_MUTED; 
my $_TOGGLE_MUTE; 
my $_VOL; 
my $_INC_VOL; 
my $_DEC_VOL; 

GetOptions(
    "is-muted" => \$_IS_MUTED 
, "toggle-mute" => \$_TOGGLE_MUTE 
, "volume"  => \$_VOL 
, "inc-vol"  => \$_INC_VOL 
, "dec-vol"  => \$_DEC_VOL 
); 

my $sink = `pactl info | sed -rn 's/^Default Sink: (.+)\$/\\1/gp'`; 
chomp $sink; 

sub ismuted { 
    my $ismuted = `pacmd dump | grep "$sink" | grep sink-mute | grep yes`; 
    chomp $ismuted; 
    if ($ismuted ne "") { 
     return 1; 
    } else { 
     0; 
    } 
} 

sub curvol { 
    my $volline = `pacmd dump | grep "$sink" | grep sink-vol`; 
    if ($volline = ~m/(0x[0 - 9 a - f] +) /) { 
     return hex $1; 
    } else { 
     return 0; 
    } 
} 

if ($_IS_MUTED) { 
    print ismuted(), "\n"; 
} 
elsif($_TOGGLE_MUTE) { 
    if (ismuted()) { 
     `pactl set-sink-mute $sink 0`; 
    } else { 
     `pactl set-sink-mute $sink 1`; 
    } 
} 
elsif($_VOL) { 
    print int(curvol() * 100.0/hex("0x10000")), "%\n"; 
} 
elsif($_INC_VOL) { 
    my $newvol = min(hex("0x10000"), curvol() + int((hex("0x10000") * .04))); 
    `pactl set-sink-volume $sink $newvol`; 
} 
elsif($_DEC_VOL) { 
    my $newvol = max(0, curvol() - int((hex("0x10000") * .04))); 
    `pactl set-sink-volume $sink $newvol`; 
} 

Тогда в моей xmonad конфигурации, у меня есть регулятор громкости связан с Ctrl + Alt + (страница вверх/страница вниз/конец).

`additionalKeys` 
[ 
    ((controlMask .|. mod1Mask, xK_Page_Up), spawn "pulse_control.pl -inc") 
, ((controlMask .|. mod1Mask, xK_Page_Down), spawn "pulse_control.pl -dec") 
, ((controlMask .|. mod1Mask, xK_End), spawn "pulse_control.pl -toggle") 
] 
Смежные вопросы