我终于得到了引用 ruby-alsa library 的代码,但我又被卡住了。最终,当从客户端调用操作时,我希望在服务器上播放音频文件。因此,我的控制器中有以下代码:
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
通过阅读ALSA 库的 RDoc,我得到的印象是我应该使用 ALSA::PCM::Playback 类中的write_in_background 方法。不幸的是,我无法获得正确的语法来使此方法起作用。为了简单地验证我的 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 播放音频,但我不确定如何让它在后台连续播放而不需要睡眠。