Я наконец получил свой код для ссылки на библиотеку ruby-alsa , но я снова застрял. В конце концов, я бы хотел, чтобы на сервере воспроизводился аудиофайл при запуске действия со стороны клиента. Таким образом, у меня есть следующий код в моем контроллере:
File.open('./public/audio/test.wav', 'r') do |f|
ALSA::PCM::Playback.open do |playback|
playback.write do |length|
f.read length
end
end
end
Читая RDoc для библиотеки ALSA , у меня складывается впечатление, что я должен использовать метод write_in_background из класса ALSA :: PCM :: Playback. К сожалению, я не могу получить правильный синтаксис, чтобы заставить этот метод работать. Чтобы просто проверить, правильно ли работает ALSA, я попытался использовать метод Playback.write (см. Код выше). Приведенный выше код является синтаксически правильным; однако он воспроизводит звук только в течение микросекунды, а затем останавливается. Я думаю, что запрос заканчивается так быстро, что у него нет времени, чтобы воспроизвести что-нибудь узнаваемое.
Как упоминалось ранее, моя конечная цель - заставить конечного пользователя вызвать действие, которое воспроизводит звук на сервере. Файл не должен прекращать воспроизведение в конце HTTP-запроса - он должен продолжаться до тех пор, пока не будет вызвано другое действие, которое останавливает воспроизведение. Зная это, может кто-нибудь помочь мне с правильным синтаксисом и параметрами для вызова метода write_in_background? Боюсь, что документация ruby-alsa , которая у меня есть в данный момент, оказалась недостаточно полезной для меня (как новичка в Ruby).
Обновление: Если я заменил вышеуказанный вызов метода write на вызов метода write_to_background, я получу следующую ошибку времени выполнения: не могу добавить обработчик pcm (функция не реализована)
Обновление 2: Я пробовал это с другим WAV-файлом и следующим кодом, и он воспроизводится со скоростью деформации.
File.open('./public/audio/sample.wav', 'r') do |f|
ALSA::PCM::Playback.open do |playback|
playback.write do |length|
@temp = length
f.read length
end
sleep 4
end
end
Кажется, здесь может происходить комбинация вещей. Я полагаю, что первое относится к частоте дискретизации (длина == 44100, что является качеством CD). Мне нужно разобраться, как воспроизводить аудиофайлы с разной скоростью. Помимо этого, однако, я все еще застрял на том, как заставить его играть в фоновом режиме. Хотя сон доказывает, что ALSA работает, он не будет хорошо работать в реальном сценарии.
Обновление 3: Получил работающий бит частоты дискретизации, даже если он временно использует магическое число:
File.open('./public/audio/sample.wav', 'r') do |f|
ALSA::PCM::Playback.open "default", {:channels => 1, :sample_rate => 11025} do |playback|
playback.write do |length|
@temp = length
f.read length
end
sleep 4
end
end
На данный момент у меня есть код ruby, воспроизводящий аудио через ALSA, но я не уверен, как заставить его непрерывно воспроизводиться в фоновом режиме, не требуя сна.