[C# / directsound] Wav files achter elkaar afspelen

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
Heb op dit moment het volgende:

code:
1
2
3
4
m_Buffer = new SecondaryBuffer("a.wav", d, dSound);
m_Buffer.Volume = -3000;   
m_BufferBytes = m_Buffer.Caps.BufferBytes;
m_Buffer.Play(0, BufferPlayFlags.Default);


Dit speelt heel simpel a.wav af.
Ik wil nu zeg maar gelijk nadat a.wav gestopt is, b.wav afspelen.

Hoe kan ik dit zo eenvoudig mogelijk bereiken? Ben al in de weer geweest met een stream met een timer thread, maar kan het niet eenvoudiger?

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Euh, gewoon een tweede SecondaryBuffer aanmaken, deze voorbereiden zodat hij klaar staat om te spelen. Zodra de 1e stopt start je de 2e..

Download my music on SoundCloud


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-04 22:00
Kun je niet een beetje voor de muziek uitlopen? Door bijvoorbeeld alvast meerdere bestanden uit te lezen, in plaats van 1 voor 1.

  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
dominic schreef op donderdag 01 december 2005 @ 15:49:
Euh, gewoon een tweede SecondaryBuffer aanmaken, deze voorbereiden zodat hij klaar staat om te spelen. Zodra de 1e stopt start je de 2e..
Maar hoe zie je dat de 1e is gestopt?

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

JvdS schreef op donderdag 01 december 2005 @ 15:51:
[...]

Maar hoe zie je dat de 1e is gestopt?
Jazeg, kijk even in de object reference bij Microsoft voor de events en properties.

Download my music on SoundCloud


  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
dominic schreef op donderdag 01 december 2005 @ 15:51:
[...]
Jazeg, kijk even in de object reference bij Microsoft voor de events en properties.
Daar kwam ik dus niet uit, maar ik merk al dat ik m'n vraag bij GoT heb gepost :)
Desondanks bedankt!

Edit:
http://msdn.microsoft.com...uffer/secondarybuffer.asp
Kan hier niks vinden over de status van de buffer?

[ Voor 28% gewijzigd door JvdS op 01-12-2005 16:03 ]


  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

http://msdn.microsoft.com...uffer/secondarybuffer.asp

Daar staat alles.

edit: ja.. In de documentatie staat genoeg om met een beetje logisch denken dit voor elkaar te krijgen.

[ Voor 25% gewijzigd door dominic op 01-12-2005 16:06 ]

Download my music on SoundCloud


  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Hiermee kan je de status uitlezen: http://msdn.microsoft.com...und/c/buffer/p/status.asp
Status is een property onder Buffer, waar SecondaryBuffer van inherit.

Alleen wel jammer dat Buffer geen relevante events biedt. Je moet in feite continu die property uitlezen... :/

[ Voor 4% gewijzigd door Zr40 op 01-12-2005 22:07 ]


  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
Bedankt, het is opgelost!
Maar zit nu met een ander bijkomend probleem:
Als ik bv. 3 kleine .wav bestandjes snel achter elkaar afspeel, dan zit er toch een kleine pauze tussen. Is dit wel op te lossen? Of moet ik het op een totaal andere manier aan gaan pakken?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

JvdS schreef op dinsdag 06 december 2005 @ 12:38:
Bedankt, het is opgelost!
Maar zit nu met een ander bijkomend probleem:
Als ik bv. 3 kleine .wav bestandjes snel achter elkaar afspeel, dan zit er toch een kleine pauze tussen. Is dit wel op te lossen? Of moet ik het op een totaal andere manier aan gaan pakken?
Waar komt die kleine pauze vandaan, als bestand 1 nog maar 2 seconden moet kun je bijvoorbeeld al beginnen met het afspelen van bestand 2.

Dit kun je doen als bestand 1 bijvoorbeeld nog even doorspeeld maar er eigelijk geen hoorbaar geluid meer is, dit kan komen door een fade-out bijvoorbeeld.

Maar met wat buffering moet het gewoon lukken hoor. Ik denk dat je zelf gewoon iets verkeerd doet.

Wanneer start je nu precies het volgende bestand?

  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
code:
1
2
3
4
ApplicationBuffer.Volume = this.volume;
                    ApplicationBuffer.Play(0, BufferPlayFlags.Default);                    
                    while (ApplicationBuffer.Status.Playing)
                    { }


En daarna weer opnieuw.
Maar blijkbaar komt er dan een pauze tussen.

Edit: Ik kan natuurlijk het while lusje aanpassen en kijken of de file bijna afgespeeld is (met de property ApplicationBuffer.PlayPosition), maar ik moet er eerst achter komen hoe ik achter de lengte van de file kom die op dat moment in de buffer staat.

[ Voor 30% gewijzigd door JvdS op 06-12-2005 13:20 . Reden: toevoeging ]


  • JvdS
  • Registratie: December 2003
  • Laatst online: 19:15
Gevonden!

De property zat niet in de klasse SecondaryBuffer maar in BufferDescription (beetje verwarrend imo).
Zoals ik het nu doe:

code:
1
while (ApplicationBuffer.Status.Playing && (ApplicationBuffer.PlayPosition < desc.BufferBytes - 500))

Verwijderd

Ik zie dat er inderdaad alweer een paar sterke GoT replies zijn gegeven :)

Ik heb even op GameDev gezocht, maar daar zijn ze er ook nog niet helemaal uit. Een optie die daar veel wordt aangedragen is om de buffer op een andere, lage prioriteit thread te starten en op die thread (of weer een andere) met een oneindige lus de status uit te lezen.

Voor de nette, maar moeilijke manier kun je de ControlPositionNotify in je BufferDescription op true zetten. Vervolgens kun je een Notify object aanmaken op je buffer en met de SetNotificationPositions method van dit object aangeven op welke posities in de buffer je gewaarshuwd wilt worden.

Om de position notifications in te stellen moet je gebruik maken van het System.Threading.AutoResetEvent, een ingebouwd onderdeel van de threading API in C#. Hieronder staan enkele links met voorbeelden en meer info:

- MSDN pagina over buffers, zoek naar Buffer Notification
- code snippet 1, rommelig maar met goede uitleg
- code snippet 2, cut & paste, zo lang je je BufferDescription goed in stelt


Maar goed, dat was natuurlijk ook allemaal uit die MSDN pagina af te leiden }) ;)

Edit: Als je trouwens meer met Managed DirectX wilt gaan doen, dan kun je het beste de C++ documentatie (die help file in de SDK) erbij houden. Ik heb me al vaker het hoofd gebroken over hoe iets nu moest in Managed DirectX, terwijl het tot in den treure beschreven staat in de C++ documentatie... Ze liggen nog een *klein* beetje achter met de managed documentatie :z

[ Voor 10% gewijzigd door Verwijderd op 06-12-2005 14:50 . Reden: Tip toegevoegd ]

Pagina: 1