[ Leopold13 @ 06.12.2008. 10:08 ] @
Pozdrav, pokusavam na napravim aplikacuju za slusanje muzike. Uspeo sam da pustim pesmu, ali na taj nacin sto je izaberem iz listbox-a i pritisnem dugme play*, ali ono sto me interesuje je da li neko zna kako da odradim sledece: kad se doticna pesma zavrsi kako da automatski pocne sledeca pesma koja je na spisku (da ne moram non-stop da klikcem dugme play)

*player = new SoundPlayer(Lista.SelectedItem.ToString());
player.Play();

Hvala unapred
[ Sephiroth? @ 06.12.2008. 11:54 ] @
Problem sa SoundPlayer-om je što je jako nefleksibilan i rudimentalan. Prvo, možeš samo puštati .waw file-ove sa njim; a
što se tiče toga što ti tražiš, problem je što on ne podržava nikakve queue feature, niti evente ili notifikacije završenog
playback-a, ništa.

Mislim da bi jedini način za rješavanje ovoga bilo da napraviš novu nit, te pokrećeš audio zapise sa sp.PlaySync().
Pokušao sam i radi:

Code:

       public Form1()
       {
            InitializeComponent();
            Thread t = new Thread(new ThreadStart(Sound));
            t.Start();            
        }

        private void SoundTest()
        {
            SoundPlayer sp = new SoundPlayer();
            sp.Stream = WindowsFormsApplication1.Properties.Resources.ringin;
            sp.PlaySync();
            sp.Stream = WindowsFormsApplication1.Properties.Resources.ringout;
            sp.PlaySync();
            sp.Stream = WindowsFormsApplication1.Properties.Resources.ringin;
            sp.PlaySync();
            sp.Stream = WindowsFormsApplication1.Properties.Resources.recycle;
            sp.PlaySync();
        }


Mislim, ovaj dio koda ti neće riješiti ništa, ali nadam se da ćeš dobiti ideju kako. Stvar je u tome da će PlaySync() zablokirati
izvršavajuću nit, te da odmah nakon toga moraš učitati novi file za playback. Ja sam uzeo par file-ova iz Windows/Media foldera.
Pošto ćeš sada raditi sa nitima, potrebna ti je i sinhronizacija svega što koristiš u novoj niti, uključujući pristupanje listbox-u i ostalom.

Možda bi mogao iskoristiti nešto ovako:

Code:


        private void SoundTest()
        {
            SoundPlayer sp = new SoundPlayer();

            while(playing)
            {
                sp.Stream = GetNextFile();
                sp.PlaySync();
            }
        }



Naravno, sve napisano je jako jednostavno i ne pazi na probleme poput Thread Safety-a.

BTW, ne moraš za ovu svrhu koristiti SoundPlayer, jer imaš sa Windows-om jednu komponentu koja je standardni
dio DirectX-a, a to je Quartz COM komponenta (ili DirectShow). Ona osim waw, podržava i sve ostale formate: mp3, midi, wma itd...
Možeš čak i video sa njom da pustiš.
Prvo odeš na Add Reference (u VisualStudiu, pretpostavljam da njega koristiš), pa odeš na Browse,te u Windows/System32 nađeš quartz.dll.

Evo stavio sam i projekat u kojem imaš jednostavan player koji koristi quartz.



EDIT: Ne znam zašto mi neće da upload-a na ES, ali evo link onda na rapidshare

http://rapidshare.com/files/170777473/QuartzSound.rar.html
[ deerbeer @ 06.12.2008. 12:02 ] @
Koristi bolje managed DirectShow za takve stvari
Code:

using System;
using QuartzTypeLib;
class PlayFile 
{
  public static void Main( string [] args ) 
  {
   FilgraphManagerClass graphClass = null;
   try 
   {
      graphClass = new FilgraphManagerClass();
      graphClass.RenderFile( args[0] );
      graphClass.Run(); 
      int evCode;
      graphClass.WaitForCompletion( -1, out evCode ); //cekas na zavrsetak pa pustas sledeci fajl .
   }
   catch( Exception ) {} 
   finally 
   { 
       graphClass = null; 
   }  
  }
}

[ deerbeer @ 06.12.2008. 12:34 ] @
http://blogs.msdn.com/toub/
[ Aleksandar Ružičić @ 06.12.2008. 12:37 ] @
ili koristi neku biblioteku kao sto je BASS (imas na dnu strane .NET API)