große Multi-Sample-Audio-Dateien in dem Speicher geladen für die Wiedergabe - wie vorübergehendes Einfrieren zu vermeiden

StackOverflow https://stackoverflow.com/questions/2373094

Frage

ich eine Anwendung schreibe braucht große Multi-Audio-Samples zu verwenden, in der Regel rund 50 MB groß. Eine Datei enthält etwa 80 einzelne kurze Tonaufnahmen, die durch meine Bewerbung zurück zu jeder Zeit gespielt bekommen. Aus diesem Grund werden die Audiodaten wird für den schnellen Zugriff in den Speicher geladen.

Wenn jedoch Laden einer dieser Dateien, kann es viele Sekunden dauern, in den Speicher zu setzen, mein Programm heißt, wenn vorübergehend eingefroren. Was ist ein guter Weg, um dies zu vermeiden? Es muss mit Windows und OS X kompatibel Es friert an diesem. myMultiSampleClass->open(); die viele dynamische Speicherzuweisung zu tun hat, und das Lesen aus der Datei ifstream mit

Ich habe gedacht, von zwei möglichen Optionen:

  1. Öffnen Sie die Datei und laden Sie es in den Speicher in einem anderen Thread so meine Bewerbung nicht gefriert. Ich habe in die Boost-Bibliothek sah, dies zu tun, müssen aber ziemlich viel Lesen tun, bevor ich bereit bin zu implementieren. Alles, was ich brauchen würde, ist die open () Funktion in dem Thread zu tun rufen dann danach den Faden zerstören.

  2. mit einem Schema Kommen Sie um sicherzustellen, dass ich die gesamte Datei in den Speicher lädt nicht zu jeder Zeit, lade ich nur im Fluge so zu sprechen. Das Problem ist, jede Probe jederzeit ausgelöst werden könnte. Ich weiß, dass einige andere Software dieser Art von System eingerichtet hat, aber ich bin nicht sicher, wie es funktioniert. Es hängt viel von einzelnen Computer Spezifikationen, könnte es mit einem langsamen HDD / Speicher auf meinem Computer aber jemand große Arbeit konnte sehr schlechte Ergebnisse erhalten. Eine Idee, die ich hatte, war zu Last x Proben jeder Audio-Aufzeichnung in den Speicher, dann, wenn ich spielen müssen, starten Sie die Wiedergabe der Proben, die bereits existieren, während das Laden der Rest des Audio in den Speicher.

Irgendwelche Ideen oder Kritik? Vielen Dank im Voraus: -)

War es hilfreich?

Lösung

Ich mag Lösung 1 als ein erster Versuch -. Simple & auf den Punkt

Wenn Sie unter Windows verfügbar sind, können Sie asynchrone Dateioperationen tun - was sie nennen ÜBERLAPPVERBINDUNG -. das Betriebssystem anweisen, eine Datei zu laden, und Sie wissen lassen, wenn es fertig ist

Andere Tipps

Verwenden Sie einen Speicher Mapped-Datei . Ladezeit ist zunächst „instant“, und der Aufwand für I / O wird über die Zeit verteilt sein.

Ich denke, die beste Lösung ist es, ein kleines Stück oder einzelne Probe von Wellendaten zu einem Zeitpunkt während der Wiedergabe mit asynchronem I / O (wie John Dibling erwähnt) zu einer festen Größe der Wiedergabepuffer zu laden.

wird die Strategie der Wiedergabepuffer füllen sein zuerst, dann spielen (dies wird kleine Menge Verzögerung hinzufügen, aber garantiert eine kontinuierliche Wiedergabe), während die Puffer zu spielen, können Sie einen anderen Wiedergabepuffer auf anderen Thread (überlappt) wieder füllen, zumindest Sie müssen zwei Wiedergabepuffer haben, eine für das spielen und eine für Großraummine im Hintergrund, schalten Sie es dann in Echtzeit

später können Sie einstellen, wie groß die Wiedergabe Puffergröße basierend auf dem Client-PC-Leistung (es zwischen Speichergröße abwägen wird und Rechenleistung wird schnellster CPU kleinen Puffer benötigt somit geringere Verzögerung).

Sie können einen Erzeuger-Verbraucher- Ansatz zu betrachten. Diese im Grunde beteiligt die Tondaten in einen Puffer liest ein Thread verwendet wird, und das Streaming der Daten aus dem Puffer an die Soundkarte einen anderen Faden.

Der Datenleser ist der Produzent und Streaming der Daten an die Soundkarte ist der Verbraucher. Sie benötigen Hochwasser und Niedrigwassermarken, so dass, wenn der Puffer voll ist, stoppt der Produzent zu lesen, und wenn der Puffer leer wird, startet der Produzent wieder zu lesen.

A C ++ Producer-Consumer Concurrency Template Library
http://www.bayimage.com/code/pcpaper.html

EDIT: Ich sollte hinzufügen, dass diese Art der Sache heikel ist. Wenn Sie einen Sample-Player bauen, auf dem System die Last kontinuierlich variiert in Abhängigkeit von dem Schlüssel, die gespielt werden, wie viele Töne auf einmal spielen, wie lange die Dauer jeden Tons ist, ob das Haltepedal gedrückt wird, und andere Faktoren, wie beispielsweise Festplattengeschwindigkeit und Pufferung und Menge an Prozessorleistung zur Verfügung. Einige Programmier Optimierungen, dass Sie schließlich beschäftigen wird auf den ersten Blick nicht offensichtlich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top