Chargement des fichiers volumineux audio multi-échantillons en mémoire pour la lecture - comment éviter le gel temporaire

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

Question

Je suis en train d'écrire une application a besoin d'utiliser un grand multi-échantillons audio, généralement autour de 50 Mo en taille. Un fichier contient environ 80 individuels enregistrements sonores courts, ce qui peut se lu par mon application à tout moment. Pour cette raison, toutes les données audio est chargé en mémoire pour un accès rapide.

Cependant, lors du chargement d'un de ces fichiers, il peut prendre plusieurs secondes pour mettre en mémoire, ce qui signifie mon programme si temporairement gelé. Qu'est-ce qu'un bon moyen d'éviter que cela se produise? Il doit être compatible avec Windows et Mac OS X. Il gèle à ceci:. myMultiSampleClass->open(); qui doit faire beaucoup d'allocation dynamique de mémoire et la lecture du fichier en utilisant ifstream

Je l'ai pensé à deux options possibles:

  1. Ouvrez le fichier et le charger dans la mémoire dans un autre thread donc mon processus d'application ne gèle pas. Je l'ai regardé dans la bibliothèque Boost pour faire cela, mais besoin de faire beaucoup de lecture avant que je suis prêt à mettre en œuvre. Tout ce que je aurais besoin de faire est d'appeler la fonction open () dans le fil puis détruire le fil après.

  2. Venez avec un système pour vous assurer que je ne pas charger le fichier en mémoire à un moment donné, je viens de charger à la volée pour ainsi dire. Le problème est tout échantillon pourrait être déclenchée à tout moment. Je sais que d'autres logiciels a ce genre de système en place, mais je ne sais pas comment cela fonctionne. Cela dépend beaucoup des spécifications de chaque ordinateur, il pourrait fonctionner à merveille sur mon ordinateur mais quelqu'un avec un disque dur / mémoire lente pourrait obtenir des résultats très mauvais. Une idée que j'avais été de charger x échantillons de chaque enregistrement audio en mémoire, alors si je dois jouer, commencer la lecture des échantillons qui existent déjà tout en chargeant le reste de l'audio en mémoire.

Toutes les idées ou critiques? Merci à l'avance: -)

Était-ce utile?

La solution

J'aime la solution 1 en tant que première tentative -. Simple et au point

Si vous êtes sous Windows, vous pouvez effectuer des opérations de fichiers asynchrone - ce qu'ils appellent ENGAGES. - pour dire le système d'exploitation pour charger un fichier et vous faire savoir quand il est prêt

Autres conseils

Utilisez un fichier mappé . temps de chargement est d'abord « instantanée », et les frais généraux d'E / S sera étalée dans le temps.

i pense que la meilleure solution consiste à charger un petit morceau ou d'un échantillon unique de données d'onde à la fois pendant la lecture à l'aide d'E / S asynchrone (comme John Dibling mentionné) à une taille fixe de mémoire tampon de lecture.

la stratégie sera remplir la mémoire tampon de lecture d'abord, puis jouer (cela ajoutera peu de retard, mais garantit la lecture en continu), tout en jouant le tampon, vous pouvez re-remplir un autre tampon de lecture sur différents fil (chevauché), au moins vous devez avoir deux tampon de lecture, un pour le jeu et une pour la recharge en arrière-plan, puis mettez-le en temps réel

vous pouvez ensuite définir la taille de la taille de la mémoire tampon de lecture basée sur la performance client PC (il sera compromis entre la taille de la mémoire et de puissance de traitement, le processeur le plus rapide nécessitera un tampon plus petit retard donc plus faible).

Vous pouvez envisager un approche producteur-consommateur. En gros, cela implique la lecture des données sonores dans un tampon à l'aide d'un fil, et le streaming des données de la mémoire tampon à votre carte son en utilisant un autre fil.

Le lecteur de données est le producteur, et le streaming des données sur la carte son est le consommateur. Vous avez besoin de hautes eaux et des marques à faible eau de telle sorte que, si le tampon est plein, le producteur cesse de lire, et si le tampon est faible, le producteur commence à lire à nouveau.

Concurrency Template Library C Producteur-Consommateur de http://www.bayimage.com/code/pcpaper.html

EDIT: Je dois ajouter que ce genre de chose est délicate. Si vous construisez un lecteur d'échantillon, la charge sur le système varie de façon continue en fonction de quelles touches sont jouées, combien de sons jouent à la fois, combien de temps la durée de chaque son est, si la pédale de sustain est pressé, et d'autres facteurs tels que la vitesse du disque dur et de mise en mémoire tampon, et la quantité de puissance de traitement disponible. Quelques optimisations de programmation que vous employez à terme ne sera pas évident à première vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top