Установить громкость используя php exec и amixer

740
Markus Kottländer

Я написал небольшой скрипт php для управления громкостью моей локальной машины с помощью alsa:

<?php # for simplicity and testing it really just executes the command: echo exec('amixer set Master 5%+') . " \n"; 

Теперь, когда я запускаю этот скрипт в командной строке, он работает нормально:

$ php volume.php  Front Right: Playback 39226 [60%] [on]  $ php volume.php  Front Right: Playback 42503 [65%] [on]  $ php volume.php  Front Right: Playback 45780 [70%] [on] 

У меня играет музыка, и я слышу, как она становится громче.

Но когда я пытаюсь запустить скрипт через apache из браузера, http://localhost/volume.phpон не работает.

# http://localhost/volume.php Front Right: Playback 55709 [10%] [on] # F5 Front Right: Playback 55709 [15%] [on] # F5 Front Right: Playback 55709 [20%] [on] 

Теперь я не слышу никаких изменений в объеме, и проценты, кажется, не связаны с текущим состоянием. Это говорит 10% - 15% - 20%, когда это действительно все еще на 70%.

Мой apache работает как мой пользователь, поэтому exec('whoami')дает мне имя пользователя, с которым я вошел в свою оболочку, где все работает нормально.

# httpd.conf User mkt Group mkt 

Я на Fedora 22.

Вероятно, это связано с процессной средой apache2. Любые идеи, как это исправить?

ОБНОВЛЕНИЕ :

Это вывод aplay -L:

[mkt@localhost ~]$ aplay -L null Discard all samples (playback) or generate zero samples (capture) pulse PulseAudio Sound Server default Default ALSA Output (currently PulseAudio Sound Server) sysdefault:CARD=Intel HDA Intel, ALC888 Analog Default Audio Device front:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog Front speakers surround21:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 2.1 Surround output to Front and Subwoofer speakers surround40:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 4.0 Surround output to Front and Rear speakers surround41:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 4.1 Surround output to Front, Rear and Subwoofer speakers surround50:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 5.0 Surround output to Front, Center and Rear speakers surround51:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 5.1 Surround output to Front, Center, Rear and Subwoofer speakers surround71:CARD=Intel,DEV=0 HDA Intel, ALC888 Analog 7.1 Surround output to Front, Center, Side, Rear and Woofer speakers iec958:CARD=Intel,DEV=0 HDA Intel, ALC888 Digital IEC958 (S/PDIF) Digital Audio Output hdmi:CARD=NVidia,DEV=0 HDA NVidia, HDMI 0 HDMI Audio Output hdmi:CARD=NVidia,DEV=1 HDA NVidia, HDMI 1 HDMI Audio Output hdmi:CARD=NVidia,DEV=2 HDA NVidia, HDMI 2 HDMI Audio Output hdmi:CARD=NVidia,DEV=3 HDA NVidia, HDMI 3 HDMI Audio Output 

В командной строке работают только default и pulse:

amixer -D pulse set Master 5%+ amixer -D default set Master 5%+ 

С PHP даже эти два не работают. Во всяком случае ... мой звук исходит из динамиков моих мониторов, который подключен через HDMI. Я думаю, последние 4 устройства - мои кандидаты. Но ни один из них не работает.

$ amixer -D hdmi:CARD=NVidia,DEV=0 set Master 5%+ $ amixer -D hdmi:CARD=NVidia,DEV=1 set Master 5%+ $ amixer -D hdmi:CARD=NVidia,DEV=2 set Master 5%+ $ amixer -D hdmi:CARD=NVidia,DEV=3 set Master 5%+ 

Во всех четырех случаях это говорит: (с DEV = [0-3] конечно)

ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL hdmi:CARD=NVidia,DEV=3 amixer: Mixer attach hdmi:CARD=NVidia,DEV=3 error: No such file or directory 

ОБНОВИТЬ

Вывод aplay -l:

$ aplay -l  **** Liste der Hardware-Geräte (PLAYBACK) **** Card 0: Intel [HDA Intel], Device 0: ALC888 Analog [ALC888 Analog] Sub-Devices: 1/1 Sub-Device #0: subdevice #0 Card 0: Intel [HDA Intel], Device 1: ALC888 Digital [ALC888 Digital] Sub-Devices: 1/1 Sub-Device #0: subdevice #0 Card 1: NVidia [HDA NVidia], Device 3: HDMI 0 [HDMI 0] Sub-Devices: 1/1 Sub-Device #0: subdevice #0 Card 1: NVidia [HDA NVidia], Device 7: HDMI 1 [HDMI 1] Sub-Devices: 0/1 Sub-Device #0: subdevice #0 Card 1: NVidia [HDA NVidia], Device 8: HDMI 2 [HDMI 2] Sub-Devices: 1/1 Sub-Device #0: subdevice #0 Card 1: NVidia [HDA NVidia], Device 9: HDMI 3 [HDMI 3] Sub-Devices: 1/1 Sub-Device #0: subdevice #0  $ amixer -c0 set Master 5%+ $ amixer -c1 set Master 5%+ 

Оба не работают!

0
Что было бы полезно, так это ваши логи apache, они, скорее всего, сразу скажут вам, что не так. или вы могли бы войти это непосредственно на страницу также различными способами. djsmiley2k 8 лет назад 0
Поскольку по умолчанию используется импульсный режим, почему бы не использовать его? То есть: `pactl set-sink-volume 0 0% pactl set-sink-volume 0 100% pactl set-sink-volume 0 - + 10% pactl set-sink-volume 0 - -10%` codemonk113 8 лет назад 0
В обоих случаях вам нужно установить переменную окружения PULSE_SERVER: `putenv (" PULSE_SERVER = / run / user / ". Getmyuid ()." / Pulse / native ");`. piernov 8 лет назад 1
@piernov прибил это! Отправьте это как ответ, и я приму это. Может быть, вы также хотите разместить здесь: https://stackoverflow.com/questions/36867273/set-volume-using-php-exec-and-amixer Markus Kottländer 7 лет назад 0

0 ответов на вопрос