2011-01-02 4 views
1

Ich habe endlich meinen Code zu reference the ruby-alsa library, aber ich bin wieder stecken. Schließlich möchte ich eine Audiodatei auf dem Server abspielen lassen, wenn eine Aktion von der Clientseite aus aufgerufen wird. Als solche habe ich den folgenden Code in meinem Controller:Mit 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

Durch die RDoc for the ALSA library lesen, habe ich den Eindruck sollte ich die write_in_background method aus dem ALSA :: PCM :: Playback-Klasse werden. Leider kann ich die Syntax nicht richtig erhalten, damit diese Methode funktioniert. Um einfach zu überprüfen, ob ALSA richtig funktioniert, habe ich versucht, die Playback.write-Methode zu verwenden (Hinweiscode oben). Der obige Code ist syntaktisch korrekt; Es spielt jedoch nur für eine Mikrosekunde einen Ton und stoppt dann. Meine Vermutung ist, dass die Anfrage so schnell endet, dass sie nicht genug Zeit hat, etwas Erkennbares zu spielen.

Wie bereits erwähnt, ist es mein ultimatives Ziel, dass ein Endbenutzer eine Aktion aufruft, die Audio auf dem Server wiedergibt. Die Datei sollte am Ende der HTTP-Anfrage nicht aufhören zu spielen - sie sollte fortgesetzt werden, bis eine andere Aktion aufgerufen wird, die die Wiedergabe stoppt. Könnt ihr mir bitte helfen, die Syntax und die Parameter richtig zu bekommen, um die write_in_background Methode aufzurufen? Ich fürchte, die ruby-alsa documentation, die ich zu dieser Zeit habe, war nicht hilfreich genug für mich (als kompletter Neuling bei Ruby).

Update: Wenn ich den obigen Aufruf der Schreibverfahren mit einem Aufruf an die write_to_background Methode ersetzen, erhalte ich die folgenden Laufzeitfehler: kann nicht pcm Handler hinzufügen (Funktion nicht implementiert)

Update 2: Ich habe dies mit einer anderen WAV-Datei und dem folgenden Code versucht und es spielt mit Warp-Geschwindigkeit.

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

Es scheint, dass es eine Kombination von Dingen gibt, die hier ablaufen. Ich glaube, die erste bezieht sich auf die Sample-Rate (Länge = 44100, was CD-Qualität ist). Ich werde prüfen müssen, wie Audiodateien mit einer anderen Rate wiedergegeben werden. Darüber hinaus bin ich jedoch immer noch daran fest, wie ich es im Hintergrund spielen lassen kann. Während der Schlaf beweist, dass ALSA funktioniert, wird es in einem realen Szenario nicht gut funktionieren.

Update 3: Haben Sie die Rate Bit Probe arbeiten, auch wenn es auf eine magische Zahl stützt sich vorübergehend:

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

An diesem Punkt habe ich meine Ruby-Code-Audio über ALSA zu spielen, aber ich bin nicht sicher, wie man es kontinuierlich im Hintergrund spielen lässt, ohne den Schlaf zu benötigen.

Antwort

1

Wie wäre es mit einem eigenen Thread?

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 

bearbeiten: OK, wenn das nicht funktioniert, ich vermute es bereits einen eigenen Thread startet. Wie wäre es mit Schlafen für die Dauer? Erster Versuch:

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 
+0

Leider das gleiche - es spielt einen schnellen "Piepton" dann sofort stoppt. Ich möchte darauf hinweisen, dass ich nicht sicher bin, ob ich die Bibliothek überhaupt richtig verwende. Ich habe gerade den Beispielcode, den ich auf der Ruby-Alsa-Homepage gefunden habe, der auf $ stdin verweist, durch meine eigene Datei ersetzt. – senfo

+0

Interessanterweise dauert der exakt gleiche "Piepton" mit Ausnahme der HTTP-Anforderung vier Sekunden länger. Nicht das was ich erwartet habe. – senfo

+0

Bitte siehe Update. Das hat tatsächlich mehr als ich erwartet hatte. – senfo