Silverlightオーディオプレイヤーの概要
Silverlight技術を活用したオーディオ再生アプリケーションの実装例を紹介します。このプレイヤーは基本的な再生制御機能と進捗表示機能を備えています。
UIレイアウト設計
XAMLによるユーザーインターフェースの定義例を示します:
<Grid x:Name="MainLayout" Background="White" Height="237" Width="499">
<MediaElement x:Name="audioPlayer" Height="0" HorizontalAlignment="Left"
Margin="12,12,0,0" VerticalAlignment="Top" Width="0"
LoadedBehavior="Manual" MediaEnded="OnMediaEnded" />
<StackPanel Orientation="Horizontal" Margin="10,41,0,0">
<Button Content="再生" Name="btnPlay" Width="75" Click="OnPlayClicked" />
<Button Content="一時停止" Name="btnPause" Width="75" Click="OnPauseClicked" />
<Button Content="停止" Name="btnStop" Width="75" Click="OnStopClicked" />
<Button Content="ミュート" Name="btnMute" Width="75" Click="OnMuteClicked" />
<Button Content="ダウンロード" Name="btnDownload" Width="75" Click="OnDownloadClicked" />
</StackPanel>
<Label Name="lblDownloadProgress" Margin="138,84,0,0" Width="120" />
<TextBlock Text="再生位置:" Margin="10,113,0,0" />
<Slider Name="progressSlider" Margin="64,108,0,0" Width="293"
ValueChanged="OnProgressChanged" />
<Label Name="lblPlaybackTime" HorizontalAlignment="Right" Margin="0,113,12,0" Width="132" />
<Label Name="lblPlayProgress" Margin="12,84,0,0" Width="120" />
<TextBlock Text="音量:" Margin="259,147,0,0" />
<Slider Name="volumeSlider" Margin="295,141,0,0" Width="100"
ValueChanged="OnVolumeChanged" />
<Label Name="lblVolumeLevel" Margin="389,136,0,0" Width="59" />
<Button Content="閉じる" HorizontalAlignment="Left" Margin="424,214,0,0"
Name="btnClose" Width="75" Click="OnCloseClicked" />
</Grid>
バックエンド処理の実装
C#による機能実装のコード例:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows.Forms;
namespace AudioPlayer
{
public partial class AudioPlayerControl : UserControl
{
private string audioSourceUrl = string.Empty;
private string saveDirectory = string.Empty;
private string playbackStatus = "0";
private DispatcherTimer statusTimer = new DispatcherTimer();
public AudioPlayerControl()
{
InitializeComponent();
}
public AudioPlayerControl(string audioUrl)
{
try
{
InitializeComponent();
audioSourceUrl = audioUrl;
audioPlayer.Source = new Uri(audioSourceUrl, UriKind.Absolute);
statusTimer.Interval = TimeSpan.FromMilliseconds(1000);
statusTimer.Tick += UpdatePlaybackStatus;
statusTimer.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void UpdatePlaybackStatus(object sender, EventArgs e)
{
lblPlaybackTime.Content = string.Format(
"再生時間:{0:00}:{1:00}:{2:00}",
audioPlayer.Position.Hours,
audioPlayer.Position.Minutes,
audioPlayer.Position.Seconds);
lblPlayProgress.Content = string.Format(
"再生進捗:{0:##%}",
audioPlayer.DownloadProgress);
}
private void OnProgressChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
try
{
if (playbackStatus == "1")
{
int sliderValue = (int)progressSlider.Value;
int totalDuration = (int)audioPlayer.NaturalDuration.TimeSpan.TotalSeconds;
TimeSpan newPosition = new TimeSpan(0, 0, 0, 0, sliderValue);
audioPlayer.Position = newPosition;
}
}
catch (Exception ex)
{
throw ex;
}
}
private void OnPlayClicked(object sender, RoutedEventArgs e)
{
audioPlayer.Play();
playbackStatus = "1";
}
private void OnPauseClicked(object sender, RoutedEventArgs e)
{
playbackStatus = "0";
audioPlayer.Pause();
}
private void OnStopClicked(object sender, RoutedEventArgs e)
{
playbackStatus = "0";
audioPlayer.Stop();
}
private void OnMuteClicked(object sender, RoutedEventArgs e)
{
audioPlayer.IsMuted = !audioPlayer.IsMuted;
}
private void OnVolumeChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
double volumeLevel = (double)(volumeSlider.Value / 10);
audioPlayer.Volume = volumeLevel;
lblVolumeLevel.Content = (double.Parse(volumeLevel.ToString("F2")) * 100) + "%";
}
private void OnDownloadClicked(object sender, RoutedEventArgs e)
{
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Filter = "オーディオファイル|*.wav";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
string destinationPath = saveDialog.FileName;
System.IO.File.Copy(audioSourceUrl, destinationPath, true);
}
}
private void OnCloseClicked(object sender, RoutedEventArgs e)
{
audioPlayer.Stop();
audioPlayer.Close();
this.MainLayout.Visibility = Visibility.Hidden;
}
private void OnMediaEnded(object sender, RoutedEventArgs e)
{
playbackStatus = "0";
}
}
}
主要機能の説明
このプレイヤーは以下の機能を提供します:
- オーディオファイルの再生、一時停止、停止操作
- 再生位置のシークバーによる制御
- 音量調節とミュート機能
- 再生進捗とダウンロード状況の表示
- ファイルのローカル保存機能