Ukázka tvorby jednoduchého MP3 přehrávače.
Co bude potřeba
K tomu, abychom náš MP3 přehrávač mohli vůbec začít programovat, budeme potřebovat nějaké IDE vývojové prostředí, já volím VS 2008, ale výběr nechám jen a jen na vás. Náš MP3 přehrávač budeme psát pomocí platformy .NET 3.5, kterou byste měli mít nainstalovanou. O přehrávání zvuku se nám postará knihovna DirectX (stáhnout). K návrhu programu ve WPF použijeme Microsoft Expression Blend 2.5.
Máme-li vše připravené, pojďme na to.
Vývoj jednoduchého MP3 přehrávače
V tomto článku se nebudu zabývat tvorbou aplikace pomocí Microsoft Expression Blend 2.5, ale samotným naprogramováním funkcí MP3 přehrávače tak, aby přehrával hudební soubory. Spusťte Blend a vytvořte si aplikaci, která bude podobná té mojí.
Zde je XAML kód našeho okna:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication4.Window1"
x:Name="Window"
Title="Window1"
Width="640" Height="480" Foreground="#FFFFFFFF">
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF004685" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Margin="8,8,0,0" Content="Otevřít" Width="87" Height="39" VerticalAlignment="Top" HorizontalAlignment="Left" FontSize="18" RenderTransformOrigin="0.5,0.5" Click="Button_Click">
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="1"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Button.RenderTransform>
<Button.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FF00197B" Offset="0"/>
<GradientStop Color="#FFEBEBEB" Offset="0.5"/>
<GradientStop Color="#FFDDDDDD" Offset="0.5"/>
<GradientStop Color="#FF001C87" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="231.912,139,276.088,221" Content="Přehrát" FontSize="22" Click="Button_Click_1">
<Button.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFFFFFFF" Offset="0"/>
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF069C13" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="71,162,0,221" Content="Stop" Width="123.912" HorizontalAlignment="Left" FontSize="22" Click="Button_Click_3">
<Button.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF3F3F3" Offset="0"/>
<GradientStop Color="#FFEBEBEB" Offset="0"/>
<GradientStop Color="#FF000000" Offset="0.013"/>
<GradientStop Color="#FFFF0606" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Margin="0,162,106,221" Content="Pozastavit" Width="124.088" HorizontalAlignment="Right" FontSize="22" Click="Button_Click_2">
<Button.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF3F3F3" Offset="0"/>
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FFB9F500" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
</Grid>
</Window>
Máme-li okno navrhnuté, tak projekt v Blendu uložíme a Blend zavřeme. Nyní přichází na řadu Visual Studio, ve kterém otevřeme náš projekt, který byl vytvořen a uložen pomocí Blendu. Jako první musíme přidat do References v Solution Explorer knihovny, které budeme potřebovat. A ty jsou:
- Microsoft.DirectX.AudioVideoPlayback
- System.Windows.Forms
Knihovny přidáme následujícím způsobem:
- Klikneme pravým tlačítkem myši na References a zvolíme Add References..
- V seznamu zvolíme knihovnu, kterou potřebujeme a klikneme na OK.
- Tento postup opakujeme dokaď nepřidáme všechny knihovny
Abychom při přehrávání skladby měli přehled o tom, jaká část ze skladby je přehrána, umístíme nyní v designérovi Visual Studia do naší aplikace jeden ProgressBar, který pojmenujeme ukazatel.
Podíváme-li se nyní do okna, ve kterém Visual Studio zobrazuje náš XAML kód, zjistíme, že se rozšířil o jeden řádek:
<ProgressBar Height="19" Margin="71,97,106,0" Name="progressBar1" VerticalAlignment="Top" Value="0" />
Tak a nyní se dostáváme k té zajímavější části. Tou je samotné psaní aplikace. Klikněte tedy pravým tlačítkem na okno naší aplikace a zvolte View Code. Na začátku kódu byste měli mít následující:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Forms; //pokud není nutno dopsat
using Microsoft.DirectX.AudioVideoPlayback; //pokud není nutno dopsat
Pokud tam poslední dvě knihovny chybí, dopište je tam ručně. Tak a můžeme vesele programovat. V těle naší třídy pod metodu v mém případě Form1 vytvořte novou metodu, kterou nastavíme jako private a pojmenujeme ji otevri. Tato metoda se nám postará o zobrazení OpenFileDialog, nastavení možných souborů k výběru, uložení cesty k souboru do proměnné. Kód metody je následující:
private Audio mojeHudba;
private string NameSound;
private void otevri()
{
OpenFileDialog od = new OpenFileDialog();
od.Filter = "Hudební soubory" + " (*.wma; *.mp3)|*.wma; *.mp3|Všechny soubory|*.*";
od.ShowDialog();
NameSound = od.FileName;
}
Nyní přejdeme opět do designéra VS 2008, dvakrát poklepeme na tlačítko Otevřít. V programu se nám vytvoří další metoda nazevTlacit_Click. Tato metoda bude odkazovat na metodu otevri.
private void Button_Click(object sender, RoutedEventArgs e)
{
otevri();
}
Úplně stejným způsobem vytvoříme metody prehraj, pozastav, zastav, které používají metody z knihovny DirectX. Akce tlačítek Přehrát, Pozastavit, Zastavit vytvoříme též úplně tím stejným způsobem. U metody prehraj metodou Audio.FormFile vytáhneme náš zvuk a uložíme do proměnné, se kterou budou pracovat metody prehraj, pozastav a zastav. Kód bude vypadat následovně:
private void prehraj()
{
mojeHudba = Audio.FromFile(NameSound);
mojeHudba.Play();
}
private void pozastav()
{
mojeHudba.Pause();
}
private void zastav()
{
mojeHudba.Stop();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
prehraj();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
pozastav();
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
zastav();
}
Nyní máme hotov základ našeho přehrávače. Jako další ošetříme několik věcí. Jistě jste si všimli, že když nevyberu soubor pomocí Otevřít a kliknu na Přehrát, program spadne. Když přehrávám skladbu a kliknu ještě na Přehrát, tak se skladba spustí ještě jednou a hraje v pozadí té první. Tento problém vyřešíme takto:
- V aplikaci vytvoříme dvě proměnné typu boolean, kterou nazveme hraje a otevren.
private Boolean hraje; private Boolean otevren;
- Do metody prehraj přidáme podmínku if, která zabrání vzniku chyby:
Tím jsme zabránili spuštění hudby ještě jednou.private void prehraj() { if(otevren ==true) { if (mojeHudba == null) { mojeHudba = Audio.FromFile(NameSound); ; } mojeHudba.Play(); hraje = true; }
- Aby kód v předchozím bodě fungoval, musíme upravit metodu otevri přidáním řádku, který bude nastavovat proměnnou otevren na true, a tím pádem dovolí akci tlačítka Přehrát volat metodu prehraj:
private void otevri() { OpenFileDialog od = new OpenFileDialog(); od.Filter = "Hudební soubory" + " (*.wma; *.mp3)|*.wma; *.mp3|Všechny soubory|*.*"; od.ShowDialog(); NameSound = od.FileName; otevren = true; // tento řádek nám říká, že soubor je načten }
- Aby program nepadal při stisku tlačítka Stop a Pozastavit, upravíme metody zastav a pozastav následovně:
private void pozastav() { try { mojeHudba.Pause(); hraje = false; }catch { //chybu ignoruji } } private void zastav() { try { mojeHudba.Stop(); } catch { //chybu ignoruji } }
- Poslední věcí, kterou musíme ošetřit, je, že když má uživatel přehrávanou skladbu a klikne na Otevřít, tak aby se původní skladba vypnula a začala se přehrávat nová. To provedeme přidáním podmínky do akce tlačítka Přehrát:
private void Button_Click(object sender, RoutedEventArgs e) { if(hraje == true) { zastav(); otevri(); prehraj(); }else { otevri(); } }
- Ošetření chyb je hotové.
Poslední věcí, která nám dnes zbývá, je oživení našeho ProgressBaru. V naši třídě si definujeme další proměnou typu Timer a jménem casovac:
Timer casovac;
Nyní naši metodu prehraj rozšíříme o pár řádků, které se nám budou starat o zobrazení přehrání skladby na ProgressBar:
private void prehraj()
{
if(otevren ==true)
{
if (mojeHudba == null)
{
mojeHudba = Audio.FromFile(NameSound); ;
}
mojeHudba.Play();
hraje = true;
ukazatel.Maximum = (int)mojeHudba.Duration; //nový řádek
casovac = new Timer(); //nový řádek
casovac.Enabled = true; //nový řádek
casovac.Interval = 100; //nový řádek
casovac.Tick += new EventHandler(casovac_tick); //nový řádek
}
}
K tomu, aby nám následující kód pracoval, musíme mít metodu, která se jmenuje casovac_tick, ta nám nastavuje postupně hodnotu načtení ProgressBaru a po přehrání celé skladby ji vypne. Její kód je následující:
private void casovac_tick(object sender, EventArgs e)
{
if (hraje == true)
{
ukazatel.Value = (int)mojeHudba.CurrentPosition;
if (((mojeHudba.CurrentPosition / mojeHudba.Duration) * 100) == 100)
{
zastav();
}
}
}
Poslední, co spácháme, je nastavení, aby se zastavilo i načítání ProgressBaru, když uživatel stiskne Zastavit. Metoda zastav vypadá následovně:
private void zastav()
{
try
{
this.ukazatel.Value = this.ukazatel.Minimum; // nový řádek kódu
hraje = false;
mojeHudba.Stop();
}
catch
{
//chybu ignoruji
}
}
Závěr s poděkováním
Náš MP3 přehrávač je hotov a ani to nebolelo. Nyní můžete pro váš výtvor vytvořit instalátor a vesele propagovat mezi svými známými, spolužáky, kolegy a jinými. Tento článek je určen už pokročilejším programátorům C#, kteří vědí, o čem je řeč. Článek je již takto obsáhlý, a proto vynechávám vlákna aplikace. A závěrem děkuji Chrastymu za jeho odbornou konzultaci, bez které by tento článek nevznikl.