Caricamento di file di grandi dimensioni audio multi-campione in memoria per la riproduzione - come evitare il congelamento temporaneo

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

Domanda

Sto scrivendo un'applicazione deve utilizzare grandi multi-campioni audio, di solito circa 50 MB. Un file contiene circa 80 registrazioni a breve sonore individuali, che possono ottenere riprodotti dalla mia candidatura in qualsiasi momento. Per questo motivo tutti i dati audio viene caricato in memoria per un rapido accesso.

Tuttavia, durante il caricamento uno di questi file, può richiedere parecchi secondi per mettere in memoria, il che significa il mio programma se temporaneamente congelato. Che cosa è un buon modo per evitare che ciò accada? Deve essere compatibile con Windows e OS X. E 'congela a questo:. myMultiSampleClass->open(); che ha a che fare un sacco di allocazione dinamica della memoria e la lettura dal file utilizzando ifstream

Ho pensato a due possibili opzioni:

  1. Apri il file e caricarlo nella memoria in un altro thread così il mio processo di applicazione non congelare. Ho guardato nella libreria Boost per fare questo, ma hanno bisogno di fare un sacco di lettura prima che io sono pronto a implementare. Tutto quello che avrebbe bisogno di fare è chiamare la funzione open () nel thread poi distruggere il filo in seguito.

  2. Vieni con un piano per assicurarsi che io non caricare l'intero file in memoria in qualsiasi momento, semplicemente carico al volo per così dire. Il problema è che qualsiasi campione potrebbe essere attivato in qualsiasi momento. So che qualche altro software ha questo tipo di sistema in vigore, ma non sono sicuro come funziona. Dipende molto su specifiche del computer individuali, potrebbe funzionare grande sul mio computer, ma qualcuno con un lento HDD / Memory potrebbero ottenere risultati molto male. Un'idea che avevo era a carico x campioni di ogni registrazione audio nella memoria, quindi se ho bisogno di giocare, iniziare la riproduzione dei campioni già esistenti, mentre il caricamento del resto l'audio nella memoria.

Tutte le idee o critiche? Grazie in anticipo: -)

È stato utile?

Soluzione

Mi piace la soluzione 1 come primo tentativo -. Semplice e al punto

Se hai meno di Windows, si può fare operazioni sui file asincrona - quello che chiamano OVERLAPPED -. a dire il sistema operativo di caricare un file e consente di sapere quando è pronto

Altri suggerimenti

Usa un memoria file mappato. Il tempo di caricamento è inizialmente "istantanea", e il sovraccarico di I / O sarà la diffusione nel corso del tempo.

i che la soluzione migliore è quella di caricare un piccolo pezzo o campione singolo dato onda in un momento della riproduzione con I / O asincrono (come detto John Dibling) ad una dimensione fissa di tampone riproduzione.

la strategia sarà riempire il buffer di riproduzione prima poi giocare (questo aggiungerà piccolo ritardo ma garantisce la riproduzione continua), durante la riproduzione del buffer, è possibile ri-riempire un altro buffer di riproduzione sul thread diverso (sovrapposti), almeno è necessario disporre di due buffer di riproduzione, uno per il gioco e uno per la ricarica in background, quindi passare in tempo reale

in seguito è possibile impostare quanto grande la dimensione del buffer di riproduzione in base alle prestazioni PC client (sarà compromesso tra dimensioni della memoria e potenza di elaborazione, più veloce CPU richiederà più piccoli buffer di ritardo quindi inferiore).

Si potrebbe prendere in considerazione un produttore-consumatore approccio . Questa sostanza ha coinvolto la lettura dei dati audio in un buffer utilizzando un filo, e lo streaming dei dati dal buffer alla scheda audio utilizzando un altro thread.

Il lettore di dati è il produttore, e lo streaming dei dati alla scheda audio è il consumatore. Avete bisogno di acqua alta e marchi a basso acqua in modo che, se il buffer si riempie, il produttore interrompe la lettura, e se il buffer si sta scaricando, il produttore inizia a leggere.

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

Modifica Devo aggiungere che questo genere di cose è difficile. Se si sta costruendo un giocatore del campione, il carico sul sistema di varia continuamente in funzione del quale vengono riprodotte le chiavi, quanti suoni stanno giocando in una sola volta, per quanto tempo la durata di ogni suono è, se il pedale sustain è premuto, e altri fattori quali la velocità del disco rigido e buffer, e la quantità di potenza processore disponibile. Alcune ottimizzazioni di programmazione che alla fine si impiegano saranno non essere evidente a prima vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top