2021/12/19(Sun) 06:44:28 編集(投稿者)
[SoundInfo.vb]クラスファイル(文字数関係で2分割)
[SoundInfo.vb]クラスファイル
Imports Un4seen.Bass
''' <summary>
''' 音源管理クラス
''’</summary>
Public Class SoundInfo
Implements IDisposable
Private hSound As Integer '再生用に読み込まれた音源ファイル情報へのハンドル
Private hSyncEnd As IntPtr '再生終了時に実行されるモジュールハンドル
Private SyncEndProc As SYNCPROC '再生終了時に実行されるモジュール
Private owner As SoundManager 'BASS.NET管理クラス
''' <summary>
''' クラス開始時
''' </summary>
''' <param name="path">音源ファイルパス</param>
Public Sub New(ByVal owner As SoundManager, ByVal path As String)
MyBase.New()
Me.owner = owner
'音源を取得する。
Call GetSoundInfo(path)
End Sub
Public ReadOnly Property Path As String = "" '音源ファイルパス
Public ReadOnly Property Title As String = "none Title" 'タイトル
Private _SoundTime As String = "--:--:--"
''' <summary>
''' 音源の長さを表す文字列を取得します。
''' </summary>
''' <returns>音源の長さを表す文字列。</returns>
Public ReadOnly Property SoundTime As String '音源の長さ
Get
Call UpdateSoundInfo()
Return Me._SoundTime
End Get
End Property
Private _PlayTime As String = "--:--:--"
''' <summary>
''' 再生位置を表す文字列を取得します。
''' </summary>
''' <returns>再生位置表す文字列。</returns>
Public ReadOnly Property PlayTime As String
Get
Call UpdateSoundInfo()
Return Me._PlayTime
End Get
End Property
Private _Maximum As Integer = 0
''' <summary>
''' 再生トラックバー最大位置を取得します。
''' </summary>
''' <returns>再生トラックバー最大位置を表すミリ秒。</returns>
Public ReadOnly Property Maximum As Integer
Get
Call UpdateSoundInfo()
Return Me._Maximum
End Get
End Property
Private _PlayValue As Integer = 0
''' <summary>
''' 再生トラックバー再生位置を取得または設定します。
''' </summary>
''' <returns>再生トラックバー再生位置を表すミリ秒。</returns>
Public Property PlayValue As Integer
Get
Call UpdateSoundInfo()
Return Me._PlayValue
End Get
Set(value As Integer)
Call Bass.BASS_ChannelSetPosition(Me.hSound, Bass.BASS_ChannelSeconds2Bytes(Me.hSound, value / 1000))
End Set
End Property
Private _Volume As Single = 1.0
''' <summary>
''' 音源ファイルの再生ボリュームを表す値を取得または設定します。
''' </summary>
''' <returns>再生ボリュームを表すSingle値。最大が1.0で最小が0.0。</returns>
Public Property Volume As Single
Get
Call UpdateSoundInfo()
Return Me._PlayValue
End Get
Set(value As Single)
Bass.BASS_ChannelSetAttribute(Me.hSound, BASSAttribute.BASS_ATTRIB_VOL, value)
End Set
End Property
Private _IsActive As Integer
''' <summary>
''' 音源ファイルの状態を取得します。
''' </summary>
''' <returns>音源ファイルの状態を表すBASSActive値</returns>
Public ReadOnly Property IsActive As Integer
Get
Call UpdateSoundInfo()
Return Me._IsActive
End Get
End Property
''' <summary>
''' 音源を取得する。
''' </summary>
''' <param name="path">音源ファイルパス</param>
Private Sub GetSoundInfo(ByVal path As String)
'音源情報の取得
If System.IO.File.Exists(path) Then
Me._Path = path '音源ファイルパス
Me._Title = System.IO.Path.GetFileNameWithoutExtension(path) 'タイトル
'音源ファイルの読み込み
Me.hSound = Bass.BASS_StreamCreateFile(path, 0, 0, BASSFlag.BASS_DEFAULT)
If Me.hSound = 0 Then
Throw New ArgumentException("音源ストリームを作成できません。 ")
End If
Else
Throw New ArgumentException("音源ファイルが存在しません。")
End If
'再生終了時に実行されるモジュールハンドル
Me.SyncEndProc = AddressOf Me.syncEnd
Me.hSyncEnd = Bass.BASS_ChannelSetSync(Me.hSound, BASSSync.BASS_SYNC_END, 0, Me.SyncEndProc, IntPtr.Zero)
If Me.hSyncEnd = IntPtr.Zero Then
Throw New InvalidOperationException("同期設定を行えませんでした。")
End If
'音源の現在の状態を取得する。
Call UpdateSoundInfo()
End Sub
''' <summary>
''' 再生完了時イベント
''' </summary>
''' <param name="handle">MP3ハンドル</param>
''' <param name="channel">チャンネル</param>
''' <param name="data">データ</param>
''' <param name="user">ユーザ</param>
Public Sub syncEnd(handle As Integer, channel As Integer, data As Integer, user As IntPtr)
Bass.BASS_ChannelStop(handle) '停止
Bass.BASS_ChannelSetPosition(handle, 0.0) '再生位置を先頭へ
Call Me.owner.EventRlayEnd(Me)
End Sub
''' <summary>
''' 音源の現在の状態を取得する。
''' </summary>
Private Sub UpdateSoundInfo()
Me._IsActive = Bass.BASS_ChannelIsActive(Me.hSound) '音源ファイルの状態
Dim sec As Double = 0
Select Case Me._IsActive
Case BASSActive.BASS_ACTIVE_STOPPED, _ 'チャネルがアクティブでないか、ハンドルが有効なチャネルではありません。
BASSActive.BASS_ACTIVE_PLAYING, _ 'チャンネルは再生中(または録音中)です。
BASSActive.BASS_ACTIVE_PAUSED 'チャネルは一時停止されています。
sec = Bass.BASS_ChannelBytes2Seconds(Me.hSound, Bass.BASS_ChannelGetLength(Me.hSound))
Me._Maximum = Math.Round(sec * 1000) '再生トラックバー最大位置
sec = Math.Round(sec * 1000) / 1000
Me._SoundTime = TimeSpan.FromSeconds(sec).ToString("hh\:mm\:ss\.fff") '音源の長さ
sec = Bass.BASS_ChannelBytes2Seconds(Me.hSound, Bass.BASS_ChannelGetPosition(Me.hSound))
Me._PlayValue = Math.Round(sec * 1000) '再生トラックバー再生位置
sec = Math.Round(sec * 1000) / 1000
Me._PlayTime = TimeSpan.FromSeconds(sec).ToString("hh\:mm\:ss\.fff") '再生位置
Call Bass.BASS_ChannelGetAttribute(Me.hSound, BASSAttribute.BASS_ATTRIB_VOL, Me._Volume) '再生ボリューム
Case BASSActive.BASS_ACTIVE_STALLED '再生を継続するためのデータが不足しているため、ストリームの再生が停止しました
Me._SoundTime = "--:--:--.---" '音源の長さ
Me._Maximum = 0 '再生トラックバー最大位置
Me._PlayTime = "--:--:--.---" '再生位置
Me._PlayValue = 0 '再生トラックバー再生位置
Me._Volume = 0 '再生ボリューム
End Select
End Sub