Есть ли способ воспроизвести WAV через /dev/console? (без прав root)

Точно так же команда оболочки

/dev/urandom > /dev/console

производит случайный звук

cat music.wav > /dev/console

не работает.

Я могу использовать /dev/dsp но звук не исходит из внутреннего динамика ПК.

2 ответа2

2

TL; DR

Нет, это невозможно. Используйте aplay или mplayer .

Почему бы и нет?

Есть две проблемы с вашей идеей. Во-первых, запись в /dev/console приводит к тому, что в системной консоли отображаются записанные символы, которые обычно используются для отображения уведомлений об ошибках пользователю (я полагаю), а не для воспроизведения звуков. Если вы каким-то образом получили звук от записи в него, я думаю, это связано с вероятностью 1/256 каждого персонажа, который должен сделать короткий звуковой сигнал.

Вторая проблема заключается в том, что .wav не является необработанным, однозначным аудиопотоком, даже если он менее сложен и (как правило) не сжат, как многие другие форматы. На самом деле (iirc) никогда не может быть такой вещи, как необработанный, однозначный аудиопоток. Вам всегда (как минимум) понадобится заголовок, указывающий разрешение и частоту выборки, чтобы сделать что-нибудь полезное с данными. Я был бы очень удивлен, если бы было решено, что одной из обязанностей ядра Linux является декодирование различных аудиоформатов. Это, как правило, лучше всего делать программой в пользовательском пространстве.

Отступление:

Линия Windows 9x (по крайней мере, часть ее) выполняла декодирование изображений в ядре для иконок. Это оказалось менее чем звездной идеей и вызвало много-много голубых экранов.

Предложенное решение

Если вы хотите воспроизвести ваш wav из командной строки, есть ряд программ, которые декодируют файл для вас и сообщают его ядру, как правило, используя интерфейс ALSA. Я предлагаю aplay, который доступен на большинстве систем и довольно упрощенный, или mplayer, который также широко распространен, но с гораздо большей сложностью. Если ваша система поддерживает звук, скорее всего, установлен хотя бы один из них.

0

это должно быть возможно, но если вы согласитесь с качеством, это другая история.

во-первых, wav - это импульсно-кодовая модуляция (pcm), динамик ПК - это в значительной степени история включения или выключения, поэтому есть 2 варианта ... проанализировать частоту, которую wav намеревается архивировать (будет сложно, если их несколько частоты), а затем заставьте динамик воспроизводить эту частоту или смиритесь с тем фактом, что она может быть только «включена» или «выключена», и просто «включите или выключите», если данные в wav достигают определенной предустановки порог объем / пкм.

Кроме того, wav будет иметь гораздо более высокую частоту дискретизации, чем, вероятно, может обрабатывать аппаратная часть динамика (не уверен в этом, но не в состоянии установить другие амплитуды, кроме просто «столько напряжения, сколько может выдержать устройство», либо «ноль», между которыми нет ничего здесь большая проблема

Теперь ... то, что вы хотите изучить для метода 1, это ioctl(x, KIOCSOUND, 1193180/ требуемый-частота-в-Гц); с 0, очевидно, выключен. KDMKTONE ioctl на fd в / dev / console, похоже, должен производить указанные тоны в течение периода, указанного в jiffies.

но если вы хотите сделать это правильно, я бы взял таблицу данных микросхемы, к которой подключен динамик, и просто обратился к ней напрямую, даже не беспокоясь о /dev /console или любом другом материале linux ... так что вы действительно можете , просто включите напряжение или выключите его. который дал бы pcm модулированный звук ... просто без какого-либо изменения амплитуды между "громким" и "ничем".

возможно, все методы звучат как дерьмо в любом случае ... но сначала анализ частоты, а затем воспроизведение частоты не сработает для музыки, которая обычно содержит несколько частот одновременно.

Кажется, что весь ioctl KIOCSOUND/KDMKTONE зависит от настроек clocktick в ядре, а также от наличия /dev /console и дескриптора файла для того, что он открыт. кажется, что они не «просто обращаются к выводу ввода-вывода микросхемы, к которой подключен звуковой сигнал».

программируемый таймер прерываний (PIT) Intel 8259 порт ввода / вывода $ 0042 ж / д счетчик PIT 2, кассета и динамик (XT, AT, PS / 2)

в основном обычный подход заключается в программировании его на желаемую частоту, а затем он будет издавать звуковые сигналы, но вам нужно просто «включить» или «выключить», поэтому в основном 0 Гц или очень низкая Гц, затем перепрограммируйте PIT, когда данные из wav изменяется от '1' до 0, чтобы снова его отключить ... и так далее. обработка частоты дискретизации файла WAV зависит от программного обеспечения, как и все остальное. (возьмите среднее значение или просто пропустите сэмплы, если оно слишком высокое - оно в любом случае является аналоговым, и вы можете производить только цифровой вывод;)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .