Использование ruby-alsa - PullRequest
       7

Использование ruby-alsa

1 голос
/ 02 января 2011

Я наконец получил свой код для ссылки на библиотеку 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, но я не уверен, как заставить его непрерывно воспроизводиться в фоновом режиме, не требуя сна.

1 Ответ

1 голос
/ 02 января 2011

Как насчет того, чтобы запустить его в своем собственном потоке?

Thread.new do
  File.open('myfile.wav', 'rb') do |f|
    ALSA::PCM::Playback.open do |playback|
      playback.write do |length|
        f.read length
     end
    end
  end
end.join

Редактировать : ОК, если это не сработает, я думаю, он уже начинает свой собственный поток,Как насчет сна для продолжительности?Первая попытка:

  File.open('myfile.wav', 'rb') do |f|
    ALSA::PCM::Playback.open do |playback|
      playback.write do |length|
        f.read length
     end
    end
  end
  sleep 4 # seconds
...