2010-02-24 16 views
0

Comment créer un tampon circulaire sur le tas dans VB.NET?Tampon circulaire dans VB.NET

Ceci serait utilisé pour la lecture audio via P/Invoke pour winmm.dll waveoutopen et waveoutwrite pour supporter le développement d'un synthé logiciel. J'utilise actuellement la classe marshall pour construire un tableau régulier d'octets dans le tas.

Répondre

2

OK, je vais ... byte

Voulez-vous dire vraiment circulaire (comme dans la taille fixe) ou pourriez-vous utiliser une liste chaînée?

Et

Pourquoi s'inquiéter de "tas"? C'est VB pas "c/C++" sur un système matériel embarqué. L'utilisation du terme «tas» est-elle due à la portée des données, au cycle de vie ou à la disponibilité (dans d'autres applications? Comme dans ALLOC/MALLOC)

+0

Je ne pense pas que je puisse utiliser une liste chaînée car je dois simplement passer un pointeur vers un bloc de mémoire vers l'API winmm. Mon travail en cours est ici: http://waveout.codeplex.com/SourceControl/changeset/view/43602#798077 J'essaie de faire pivoter les tampons sur le rappel à partir du moment où une lecture de tampon est terminée, mais ce n'est pas strictement circulaire tampon – PeanutPower

+0

OK, j'ai jeté un coup d'oeil ... Il semble que vous créez vos "échantillons" dans une file d'attente/tableau puis Marshall.write octet par octet dans le tas, puis passez le ptr à la DLL multimédia. Que diriez-vous de créer une structure de données explicitement définie (c'est-à-dire des données LChannel suivies immédiatement par des données RChannel) puis de passer le pointeur à la structure à MM_ddl? Il est concevable de remplacer des données sur le "frontal" pendant que les données sont jouées. Ou vous pourriez avoir un arrangement de flip-flop où vous passez un tableau à MM_dll pendant que vous remplissez une seconde, puis passez celui-là, et retournez et remplissez le premier à nouveau. – tobrien

+0

La structure serait créée assez grande pour contenir les 44100 échantillons dont vous avez besoin par seconde. – tobrien