Avatar billede Skifter24 Praktikant
26. juli 2015 - 22:29 Der er 8 kommentarer og
1 løsning

Simpel mp3 afspiller i C#

Hej. Jeg er ved at oprette en windows8.1 app ved brug af
XAML og C#.
Målet er at lave en mp3 afspiller, der afspiller 4 sange. og hvor brugeren kun kan trykke "Play" "Stop" "Next".
Jeg starter i xaml med at lave et <MediaElement/> til hver sang. Så laver jeg knapperne. <Button/>.
Dernest går jeg til .cs delen hvor jeg bruger C# til at "Connecte" knapperne, ved at bruge if, og while..

Se her.
private void Play_Click(object sender, RoutedEventArgs e)
        {
            media2.Play();
        }

private void Next_Click(object sender, RoutedEventArgs e)
        {
            if (media2 != null)
                media1.Play();
            while (media1 != null)
                media2.Stop();
            if (media1 != null)
                media2.Play();
            while (media2 != null)
                media1.Stop();
               
        }
Det "virker". Jeg får ingen fejlkoder. Men programmet "fryser" når jeg skifter nr/trykker på "Next". Jeg er ret sikker på at det er min kodning der er noget galt med, men jeg kan ikke helt gennemskue hvor den skulle være gal ?
Avatar billede sonalias Seniormester
27. juli 2015 - 04:02 #1
Dine 2 while loops exitter aldrig da Media2.Stop() ikke har indflydelse på om media1 er null :)
Avatar billede Skifter24 Praktikant
27. juli 2015 - 10:23 #2
Jeg tænkte nok der var noget med det der !=null
Det er fordi jeg bruger forskellige tutors til det her projekt.
Men hvad skal jeg så sætte ind i stedet for ?
Har bla prøvet.

while (Media1.Play)
 
      Media2.Stop();

Men så kommer der en fejlkode i (media.Play).
Den siger at den ikke kan konvetere "metode" til "bool".
Avatar billede sonalias Seniormester
27. juli 2015 - 10:42 #3
Mediaelements har en property der hedder position der kan fortælle hvor langt den er i en afspilning, så når du laver en stop, så sætter du position til 0 (Som en timespan) og du kan se om den er igang med at spille hvis position != 0.
TL;DR Media1.Position viser hvor langt den er i en sang.
Avatar billede Skifter24 Praktikant
27. juli 2015 - 11:49 #4
Hvordan ville du skrive det ?
Tror jeg bliver nødt til at se et eksempel for at det giver mening..

I XAML har jeg skrevet koden således (ca. Der tages forbehold for stavefejl) :)

<StackPanel HorizontalAlignment="Center">
<MediaElement x:Name="media1"
              Source="Mp3/Lyd1.mp3"
              Width="300"
              AreTransportControlsEnabled="False"
              AutoPlay="False"
              IsMuted="False"/>

<MediaElement x:Name="media2"
              Source="Mp3/Lyd2.mp3"
              Width="300"
              AreTransportControlsEnabled="False"
              AutoPlay="False"
              IsMuted="False"/>
<StackPanel Orientation="Horizontal">
            HorizontalAlignment="Center"/>
<Button Content="Play" Click="Play_Click"/>
<Button Content="Stop" Click="Stop_Click"/>
<Button Content="Next" Click="Next_Click"/>

</StackPanel>

(Det underlige er også her.. At selvom der er to <StackPanel>
Skal der kun være en </StackPanel> Ellers kommer der en fejlkode ?)
I C# har jeg så sammensat det hele således..
private void Play_Click(object sender, RoutedEventArgs e)
        {
            media2.Play();
        }

private void Next_Click(object sender, RoutedEventArgs e)
        {
            if (media2 != null)
                media1.Play();
            while (media1 != null)
                media2.Stop();
            if (media1 != null)
                media2.Play();
            while (media2 != null)
                media1.Stop();
               
        }
----------
Hvordan ville du gøre det ?
Avatar billede sonalias Seniormester
27. juli 2015 - 14:02 #5
Det kunne evt gøres sådan her:
private void button_Click(object sender, RoutedEventArgs e)
        {
            TimeSpan zeroTime = new TimeSpan();
            //Starter anden sang, stopper første.
            if (media1.Position != zeroTime)
            {
                media1.Stop();
                media1.Position = zeroTime;
                media2.Play();
            }
            //Starter første sang, stopper anden.
            if (media2.Position != zeroTime)
            {
                media2.Stop();
                media2.Position = zeroTime;
                media1.Play();
            }
        }
Avatar billede sonalias Seniormester
27. juli 2015 - 14:09 #6
Lige en sidebemærkning:
Det er rigtig besværligt at oprette et mediaelement pr sang i din musikafspiller, så en løsning kan være at skifte sourcen ud istedet.
media.Source = "";
Avatar billede Skifter24 Praktikant
27. juli 2015 - 14:33 #7
Så media.Source="" skal oprettes i C# ?
Er det så før knapperne ?
Altså før, første 
private void button_Click(object sender, RoutedEventArgs e) ???
Avatar billede sonalias Seniormester
27. juli 2015 - 14:51 #8
C# er objekt orienteret programmering.
Du har et media element der hedder media1 f.eks. som du i din XAML har defineret Source="Mp3/Lyd1.mp3".
Dette kan vi så, ved tryk på next, skifte til media1.Source = "Mp3/Lyd2.mp3"

static int counter = 1;

private void button_Click(object sender, RoutedEventArgs e)
        {
TimeSpan zeroTime = new TimeSpan();
counter ++;
if(counter>2)
{ counter = 1;}

                media1.Stop();
                media1.Source = "Mp3/Lyd"+counter+".mp3"
                media1.Position = zeroTime;
                media1.Play();
            }
        }
Avatar billede Skifter24 Praktikant
27. juli 2015 - 15:01 #9
Okay. Jeg skal lige bruge noget tid på at få det til at virke. Acceptere dit svar og tak for hjælpen. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester