LINUX.ORG.RU

Следить за изменением псевдофайла в /proc

 


1

3

Ситуация такая, что есть скрипт на bash, который грепает строчку в псевдофайле в /proc и в зависимости от значения выполняет команду. Проблема в том, что это значение 95% времени одинаковое, а команда все-равно выполняется все время. inotify как выяснилось не может в /proc, может есть способ накостылять что-то с проверкой контрольных сумм? Что подскажете? Вот скрипт:

#!/bin/bash

do_it(){
    RATE="$(grep -E "rate: .*" /proc/asound/card1/pcm0p/sub0/hw_params | awk '{print $2}')"
    case "${RATE}" in
        44100    ) SET="0" ;;
        48000    ) SET="1" ;;
        88200    ) SET="2" ;;
        96000    ) SET="3" ;;
        176400    ) SET="4" ;;
        192000    ) SET="5" ;;
        *        ) SET="0" ;;
    esac
    amixer -c 1 set 'Clock rate Selector' ${SET}
}

while :; do
        do_it && sleep 0.01
done

★★★
Ответ на: комментарий от Andrew

Однако во фряхе моя звуковушка не видится в списке sndstat вообще. Это просто специфика конкретных моделей.

Что за звуковуха?

anonymous
()
Ответ на: комментарий от emulek

Похоже проблема в том, что твой производитель тупо забил на Linux, и сделал драйвер «для галочки».

С каких пор производители стали писать драйвера звуковух под линукс? Почитай авторство alsa-драйверов что ли. И я с ними согласен - писать драйвер для alsa - дикие муки

anonymous
()
Ответ на: комментарий от anonymous

нет, ты. на нормальных картах частота переключается, а на большинстве остальных нет и ресемлера. говёный ресемплер есть на говнокреативах, которые за зк не считаются

anonymous
()
Ответ на: комментарий от anonymous

Софтварный ресемплер. Также он позволяет играть те форматы, которые железом не поддерживаются. Линукс так не может, да?

anonymous
()
Ответ на: комментарий от anonymous

может и то, и другое из коробки. а ещё вообще всё что хочешь, благодаря поддержке плагинов в alsa-lib. все бздуны газифицируют, не разбираясь в вопросе?

anonymous
()
Ответ на: комментарий от anonymous

может и то, и другое из коробки.

Ага, только ТС вот какой херней мучается, и ты сам походу мало в это веришь, раз что-то про железо бубнил

anonymous
()
Ответ на: комментарий от anonymous

исходники в открытом доступе. или тебе ещё рано такое читать?

anonymous
()
Ответ на: комментарий от anonymous

все равно, в теории красиво и четко, на деле получается «все есть файл, но некоторые файлы файлее».

crowbar
()
Ответ на: комментарий от emulek

Теперь работает как нужно, да. Спасибо. По показаниям htop (скрипт и Ваша программа были запущены в одно и тоже время и прибывали запущенными ~полчаса) этот код куда более эффективен чем башевский от sdio. Теперь, если можете и у Вас есть время, добавьте изменение Clock rate Selector с помощью amixer, пожалуйста.

Andrew ★★★
() автор топика
Последнее исправление: Andrew (всего исправлений: 3)
Ответ на: комментарий от Andrew

Есть USB-звуковушка, если например на нее поступает сигнал частотой 48000Гц,

Кто, куда? Ты подключил к звуковухе генератор или ты про S/PDIF?

arson ★★★★★
()
Ответ на: комментарий от Andrew

Я имел ввиду проигрывание файла такой частоты на компьютере.

Тогда может проще заставить программу проигрывающую файл выставлять нужный rate перед открытием нового файла?

arson ★★★★★
()
Ответ на: комментарий от Andrew

Нет сомнений что программы на С и на БАШ это две большие разницы. Не малый вес в выборе реализации имеет вот это ваше «Теперь, если можете и у Вас есть время, добавьте изменение Clock rate Selector с помощью amixer, пожалуйста.», потом будут еще просьбы, твое ожидание ... ну ты понял

sdio ★★★★★
()
Ответ на: комментарий от anonymous

Конечно понимает. ТС и не хочет, чтобы при прослушивании музыки откуда не возьмись появились сторонние звуки. dmix (программное микширование) у него есть (и то только из-за того, что фф по какой-то причине не может напрямую с этой звуковушкой работать), но в плеере выбран прямой доступ.

Andrew ★★★
() автор топика
Последнее исправление: Andrew (всего исправлений: 1)
Ответ на: комментарий от Andrew

что фф по какой-то причине не может напрямую с этой звуковушкой работать

Жесть. Ну попробуй через OSS эмуляцию или вообще oss ставь. По-моему единственный вариант избежать проблем с ляликсом и в то же время на этом ляликсе оставаться.

А во фряхе, походу, эта карточка действительно не поддерживается. Можно в ручную kldload snd_uaudio сделать, чтобы убедиться

anonymous
()
Ответ на: комментарий от anonymous

Жесть.

ЕМНИП это проблема самого фф, там выкинули поддержку 16/24-битного вывода.

По-моему единственный вариант избежать проблем с ляликсом и в то же время на этом ляликсе оставаться.

Так в OSS же драйверов на эту звуковушку нет (где-то находил списочек), чего там ловить. Да и сомневаюсь я что-то, что какая-то «левая» (уже) OSS для линукса сделает мне зашибись.

А во фряхе, походу, эта карточка действительно не поддерживается. Можно в ручную kldload snd_uaudio сделать, чтобы убедиться

Пробовал, не видит.

Andrew ★★★
() автор топика
Последнее исправление: Andrew (всего исправлений: 1)
Ответ на: комментарий от Andrew

А вообще, у меня смутные сомнения, потому что device_probe там прост до безобразия. Интересно, что в dmesg пишет, когда модуль подключается

static int
uaudio_probe(device_t dev)
{
	struct usb_attach_arg *uaa = device_get_ivars(dev);

	if (uaa->usb_mode != USB_MODE_HOST)
		return (ENXIO);

	/* lookup non-standard device(s) */

	if (usbd_lookup_id_by_uaa(uaudio_vendor_midi,
	    sizeof(uaudio_vendor_midi), uaa) == 0) {
		return (BUS_PROBE_SPECIFIC);
	}

	if (uaa->info.bInterfaceClass != UICLASS_AUDIO) {
		if (uaa->info.bInterfaceClass != UICLASS_VENDOR ||
		    usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0)
			return (ENXIO);
	}

	/* check for AUDIO control interface */

	if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
		if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
			return (ENXIO);
		else
			return (BUS_PROBE_GENERIC);
	}

	/* check for MIDI stream */

	if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) {
		if (usb_test_quirk(uaa, UQ_BAD_MIDI))
			return (ENXIO);
		else
			return (BUS_PROBE_GENERIC);
	}
	return (ENXIO);
}

какбе должен подключать всё, что audio class

anonymous
()
Ответ на: комментарий от Andrew

Да, в сырцах OSS она явно не указана, хз как он будет себя вести.

От креатива только

  {0x41e, 0x3000, "Creative Sound Blaster Extigy"},
  {0x41e, 0x3010, "Creative Sound Blaster MP3+"},
  {0x41e, 0x3020, "Creative Audigy2 NX USB",

С другой стороны они все стандартные, так что хз, почему не пашет

anonymous
()
Ответ на: комментарий от anonymous

С другой стороны они все стандартные, так что хз, почему не пашет

Вот и я хз. Сам отнюдь не прочь поковырять фряшку в качестве десктопной системы, но без звуковушки не торт, увы.

Andrew ★★★
() автор топика
Ответ на: комментарий от anonymous

С каких пор производители стали писать драйвера звуковух под линукс? Почитай авторство alsa-драйверов что ли. И я с ними согласен - писать драйвер для alsa - дикие муки

УМВР, ЧЯДНТ?

emulek
()
Ответ на: комментарий от anonymous

После подгрузки модуля snd_uaudio в dmesg ничего нового нет. Но как usb-устройство оно в dmesg детектится при загрузке.

Andrew ★★★
() автор топика
Ответ на: комментарий от Andrew

Теперь, если можете и у Вас есть время, добавьте изменение Clock rate Selector с помощью amixer, пожалуйста.

дык когда изменяется rate, мой код выводит новый рейт и завершается. Дальше bash-скриптом поменяйте что вам там надо, я же говорю, у меня тупо 48000 пишет постоянно.

emulek
()
Ответ на: комментарий от sdio

Не малый вес в выборе реализации имеет вот это ваше

не, дальше скорость не имеет значения. Отслеживает код на C, и именно он завершается когда частота ИЗМЕНИЛАСЬ.

emulek
()
Ответ на: комментарий от emulek

А можно это дело зациклить, ведь его придется пускать снова и снова, получается. И каким образом на основе вывода вашего кода мне пускать bash-скрипт? Записывать вывод в файл и в башевском скрипте его читать? Тогда это будет врядли лучше первоначального скрипта. Видимо, sdio прав, лучше излишний раз не заморачиваться и выбирать рабочее решение.

Andrew ★★★
() автор топика
Ответ на: комментарий от Andrew

Хм, сейчас перепроверил, изначальный скрипт и этот в одно и тоже время, они потребляют ~идентично CPU. Опять же в htop.

Andrew ★★★
() автор топика
Последнее исправление: Andrew (всего исправлений: 1)
Ответ на: комментарий от Andrew

Мне расчитывать, когда мне случайным образом захочется послушать трек/посмотреть видео со звуком в частоте отличной от 44100гц?

Запускать просмотр/прослушивание своим скриптом. Я так несколько лет делал, когда в зависимости от 2.0 или 5.1 файла запускал или прямой вывод, или с софтовой разводкой 2.0 -> 5.1

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Я думал над тем, чтобы как-то повесить скрипт на проигрывание/смену трека в deadbeef, но к сожалению не нашел как с помощью shellexec это можно сделать. cast waker

Andrew ★★★
() автор топика
Ответ на: комментарий от Andrew

По истечению некоторого времени новый скрипт показал, что потребляет меньше изначального на ~0-1.5%.

Andrew ★★★
() автор топика

Замените bash на более легковесную оболочку dash. В вашем скрипте нет башизмов, поэтому вносить в него изменения не требуется. На моем компьютере при запуске через dash ваш скрипт потребляет в 1,5-2 раза меньше ресурсов.

gorky ★★
()
Ответ на: комментарий от Andrew

Странно. Жаль у меня нет такого устройстваA

anonymous
()
Ответ на: комментарий от emulek

Хочешь сказать, ты пишешь драйверы? В вопросе не было ни слова про работает/не работает

anonymous
()
Ответ на: комментарий от Andrew
while true; do
  RATE=$(my_prog) # здесь скрипт будет висеть и ждать,
  # пока $RATE изменится.
  # что вы там хотите сделать с $RATE я не в курсе
done
emulek
()
Ответ на: комментарий от Andrew

Я думал над тем, чтобы как-то повесить скрипт на проигрывание/смену трека в deadbeef, но к сожалению не нашел как с помощью shellexec это можно сделать.

это можно сделать с помощью mpris, вроде как.

новый рабочий плагин есть тут: https://github.com/Serranya/deadbeef-mpris2-plugin

waker ★★★★★
()
Ответ на: комментарий от emulek

Спасибо. Получилось:

while true;
do
RATE=$(./sound)
case «${RATE}» in
44100 ) SET=«0» ;;
48000 ) SET=«1» ;;
88200 ) SET=«2» ;;
96000 ) SET=«3» ;;
176400 ) SET=«4» ;;
192000 ) SET=«5» ;;
esac
amixer -c 1 set 'Clock rate Selector' ${SET}
done
Все работает.

Andrew ★★★
() автор топика

с трудом верится что нотификация не пашет там.

А если watch или ln ?

anonymous
()
Ответ на: комментарий от next_time

разве /proc лежит реально на диске?

нет конечно. Потому «файл» в кавычках, и потому я предлагаю его скопировать в tmpfs перед подсчётом cksum. Хотя это наверное и не обязательно, такой маленький файл гарантированно прочитается атомарно.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.