Die Ausgabe von Sound, Mehrere Audio-Geräte Gleichzeitig
OK, das erste Problem. Ich bin versucht, zu schreiben ein virtueller Resonanzboden, wird die Ausgabe auf mehrere Geräte auf einmal. Ich würde es vorziehen, OpenAL für diese, aber wenn ich zum Umstieg auf MS libs (ich Schreibe dies, zunächst auf Windows 7) ich.
Trotzdem, die Idee ist, dass Sie haben eine Reihe von sound-Dateien geladen und bereit zu spielen. Sind Sie auf Skype, und jemand schlägt in einem großen Weg, so drücken Sie die play-Taste auf der Preis stimmt scheitern Liedchen. Sie und Ihre Freunde hören, dieses Geräusch an der gleichen Zeit und haben ein gutes lachen über Sie.
Habe ich bekommen, OAL zu dem Punkt, wo ich spielen kann auf Standard-Gerät, und wählen Sie ein Gerät an diesem Punkt scheint eher nebensächlich. Aber von dem was ich verstehe, jedes OAL-device braucht seinen Kontext zu aktuellen, um die Puffer zu füllen/zu propagieren, richtig. Das heißt, in einem standard-Programm, das sound spielen würde auf einem Gerät und dann das Gerät eingeschaltet werden und der sound gepuffert und spielte dann auf dem zweiten Gerät.
Ist dies überhaupt möglich, mit jedem audio-Bibliothek? Würde threads beteiligen, und würde diese sicher?
Dann, das nächste problem ist, damit es nahtlos mit end-user-setups, würde es brauchen, um in der Lage sein, um entweder die Ausgabe auf die Standard-Aufnahme-Gerät, oder abfangen, das Aufnahmegerät, mischen Sie es mit den sound-und Ausgabe, die es als ein anderes Wiedergabegerät. Entweder ist dieser möglich, wenn beide sind, das ist mehr machbar? Ich denke, es wäre besser in der Lage sein, die Ausgabe an die aufzeichnungsvorrichtung selbst, als dann das Programm würde nicht laufen, um das Mikrofon immer noch Arbeit für Anrufe.
InformationsquelleAutor Malkierian | 2014-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich gut verstanden es gibt zwei Fragen hier, vor allem.
Ist es möglich, dass ein sound gespielt wird auf zwei oder mehr audio-Ausgabe-Geräte gleichzeitig, und wie Sie diese erreichen?
Ist es möglich, die loop-back-Daten über einen audio-Eingang (Aufnahme -) Gerät so, dass ist gespielt wird auf dem jeweiligen monitor ich.e zum Beispiel geschickt durch die audio-stream von Skype, um mit Ihrem partner, in Ihrem jeweiligen Fall.
Antwort zu 1: Das ist absolut machbar, alle unabhängige audio-Ausgänge Ihres Systems können sounds Abspielen gleichzeitig. Zum Beispiel einige Profi-audio-interfaces (für Musik, Produktion) haben 8, 16, 64 unabhängige Ausgänge, die alle gespielt werden können, klingen gleichzeitig. Das bedeutet, dass jedes output-Gerät verwaltet seine eigenen Puffer, der Sie verbraucht, unabhängig (abgesehen von Parallelität auf eventuelle shared memory zu füttern Puffer).
Wie?
Meisten audio-frameworks /- Systeme bieten Funktionen, um ein "device handle" was müssen Sie passieren einen Rückruf für die Fütterung der Puffer mit samples (also nicht Open AL zum Beispiel). Diese wird aufgerufen, unabhängig und asynchroneously durch das framework /system (letztlich die audio-Gerät-Treiber(s)).
Da dies alles funktioniert asynchroneously Sie nicht unbedingt brauchen multi-threading hier. Alles, was Sie tun müssen, im Prinzip ist die Pflege von zwei (oder mehr) audio-Ausgabe-Gerät-Griffe, die jeweils mit einem separaten Puffer verbraucht Rückruf, zu Weiden die zwei (oder mehr) separate Geräte.
Hinweis können Sie auch spielen mehrere sounds auf nur einem einzigen Gerät. Die meisten Geräte /Systeme erlauben diese Art von "Ressourcen-sharing". Das ist eigentlich ein Ziel für die sound-Karten sind eigentlich für. Mischen Sie alle sounds produziert, die von den verschiedenen Programmen (und somit nehmen Sie ab, die schwere Last von der CPU). Wenn Sie mit einem (physischen) Gerät zum Abspielen mehrerer sounds, das Konzept ist das gleiche wie mit mehreren Gerät. Für jeden sound, den Sie bekommen ein logisches Gerät Griff. Nur, dass diejenigen behandeln, bezieht sich auf mehrere "Kanäle" von einem physischen Gerät.
Was sollten Sie verwenden?
Open AL scheint ein wenig wie mit schwerer Artillerie für diese einfache Aufgabe würde ich sagen (da Sie nicht wollen, dass , dass viel Portabilität, und wahrscheinlich nicht planen, zu implementieren Ihre eigenen codec-und Effekt 😉 )
Ich würde empfehlen, dass Sie Qt benutzen hier. Es ist sehr portabel (Win/Mac/Linux) und es hat eine sehr praktische Klasse, die Arbeit zu tun für Sie: http://qt-project.org/doc/qt-5.0/qtmultimedia/qaudiooutput.html
Überprüfen Sie das Beispiel in der Dokumentation zu sehen, wie eine WAV-Datei wiedergeben, mit ein paar Zeilen code. Spielen mehrere WAV-Dateien gleichzeitig müssen Sie einfach öffnen Sie mehrere QAudioOutput (im Grunde genommen der code aus dem Beispiel in eine Funktion und rufen Sie Sie so oft wie Sie wollen). Beachten Sie, dass Sie haben, zu schließen /stoppen der QAudioOutput, um für die sound-Wiedergabe beenden.
Antwort zu 2:, Was Sie tun möchten, ist aufgerufen, einen loopback. Nur eine sehr begrenzte Anzahl von sound-Karten, die ich.e audio-Geräte bieten eine so genannte loopback-input Gerät, das ermöglichen würde, für die Aufnahme, was ist aktuell-Ausgabe durch den main mix-Ausgang der Soundkarte zum Beispiel. Aber auch diese Art von Gerät, vorausgesetzt, es wird nicht zulassen, dass Sie die Schleife wieder etwas in den Mikrofon-input-Gerät. Der Mikrofon-Eingang-Gerät dauert nur Daten aus dem Mikrofon D/A-Wandler. Dies ist tief in der H/W -, man kann nicht mischen Sie sich in nichts auf Ihrer Ebene gibt.
Dieser sagte, es wird sehr sehr schwer (IMHO praktikabel unmöglich) zu haben, Skype senden Ihren sound mit einem standard-setup, um Ihre Gesprächspartner. Nur was ich mir vorstellen kann wäre mit einem audio-Gerät mit loopback-Funktionen (oder einfach über eine physikalische Kabelverbindung eine mögliche monitor line-Ausgang für den Aufnahme line-in), und haben dann Skype verwenden diese looped back device als input. Aber Skype wird nicht Abholung von Ihrem Mikrofon nicht mehr, daher werden Sie nicht ein Gespräch zu führen 😉
Hinweis:, Als Sie sagte: "gleichzeitige" Wiedergabe wir reden hier über das synchronisieren der Wiedergabe von zwei sounds, wie betroffenen real-Zeit-Wahrnehmung (im Bereich von 10-20ms). Wir betrachten nicht die tatsächliche Synchronisation auf sample-Ebene und der damit verbundenen clock-jitter und phase shifting Probleme, ins Spiel kommen, wenn das senden sound auf zwei physische Geräte mit zwei unabhängig (frei Laufenden) Uhren. Somit wird, wenn die Anwendung verlangt, die in-phase-signal-generation ist auf unabhängige Geräte, clock-recovery-Mechanismen sind notwendig, die eventuell vom Treiber oder OS.
Hinweis: Virtuelle audio-Gerät-software wie Virtual Audio Kabel bieten virtuelle Geräte zu erreichen loopback functionnality in Windows. Frameworks wie Audio-Buchse kann das gleiche zu erreichen im UX-Umfeld.
Ich bin nicht einverstanden. Zuerst aus, welche Art von Verzögerung meinst du? IMHO alles, was Sie tun müssen, ist Graf - Puffer und hinzufügen ich.e-mix entsprechend. Entweder, indem man Sie in der separaten hardware-Puffer oder, indem Sie Sie oben in der software (Summierung der Werte und angeeignet Gewichtung, um Verzerrung zu vermeiden).
Offensichtlich ist der genaue Weg, um zu synchronisieren, wird das zweite (Summen-in software). Ich bin damit einverstanden, dass können Sie nicht, stellen Sie sicher, dass Ihre hardware-Puffer sind "in phase". Aber dieser Unterschied ist im Bereich des so niedrigen Phasenwinkel, dass Sie nur erkennen, es in der professionellen audio-Anwendungen wie signal-Generatoren.
Naja, ich denke, ich bin nicht überrascht über die Ausgabe an ein Mikrofon. Virtual Audio Cable ist ein Programm, das ich verwendet habe, fähig zum gefangennehmen von zwei Ausgabegeräten, mischen Sie Sie, und setzen Sie auf eine benutzerdefinierte loopback "Gerät", dass Skype können Sie dann abholen, aber es muss ausgeführt werden, damit es überhaupt funktioniert, und dann haben Sie zu halten, schalten Sie Ihren Standard-input-device die ganze Zeit. Ich hatte gehofft, dies würde nicht notwendig sein, so dass ich eigentlich vermarkten dieses Programm, aber ich denke, die Betriebssysteme sind einfach nicht dazu gedacht, um die Art von Sache leicht. Ich Schätze die info.
Du bist nicht die Rechnungslegung für die Tatsache, dass jede einzelne audio-interface hat eigene sample-output-Uhr. Vor allem, wenn Sie USB-Schnittstellen - wo die Uhr ist entweder frei läuft oder eher ungenau erholt von der isochrone rate der bus - durch die Notwendigkeit, weil der Mangel an genauen timing-Referenz. Sie können in der Theorie bekommen dies funktioniert mit IEEE-1394-audio-interfaces, wie es ist, gut definierten Modell der Darstellung der Zeit und der richtigen clock-recovery. Auf der groben Ebene, die Sie brauchen, um zu kompensieren für die Puffer-Latenz auf jedem Ausgabegerät.
InformationsquelleAutor Tchakabam
Gibt es eine sehr einfache Möglichkeit, audio-Ausgang auf zwei Geräte zur gleichen Zeit:
Habe ich erklärt, BEIDE Lösungen in diesem video: https://youtu.be/lpvae_2WOSQ
Beste Grüße
InformationsquelleAutor schneemann gaming