/// <summary> /// 打开文件 /// </summary> /// <param name="filename">文件名</param> public void OpenFile(string filename) { openningFile = filename; //Debug.WriteLine("已调用BassEngine.OpenFile()"); Stop(); pendingOperation = PendingOperation.None; var flag = (Un4seen.Bass.BASSFlag)Enum.Parse(typeof(Un4seen.Bass.BASSFlag), ConfigurationManager.AppSettings["Bass.OpenFileConfig"]); int handle = Un4seen.Bass.Bass.BASS_StreamCreateFile(filename, 0, 0, flag); if (handle != 0) { ActiveStreamHandle = handle; ChannelLength = TimeSpan.FromSeconds(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(ActiveStreamHandle, Un4seen.Bass.Bass.BASS_ChannelGetLength(ActiveStreamHandle, 0))); Un4seen.Bass.BASS_CHANNELINFO info = new Un4seen.Bass.BASS_CHANNELINFO(); Un4seen.Bass.Bass.BASS_ChannelGetInfo(ActiveStreamHandle, info); sampleFrequency = info.freq; int syncHandle = Un4seen.Bass.Bass.BASS_ChannelSetSync(ActiveStreamHandle, Un4seen.Bass.BASSSync.BASS_SYNC_END, 0, endTrackSyncProc, IntPtr.Zero); if (syncHandle == 0) { throw new ArgumentException("Error establishing End Sync on file stream.", "filename"); } CanPlay = true; RaiseOpenSucceededEvent(); switch (pendingOperation) { case PendingOperation.None: break; case PendingOperation.Play: Play(); break; case PendingOperation.Pause: Pause(); break; default: break; } } else { RaiseOpenFailedEvent(); } }
/// <summary> /// 播放当前流 /// </summary> private void PlayCurrentStream() { // Play Stream if (ActiveStreamHandle != 0 && Un4seen.Bass.Bass.BASS_ChannelPlay(ActiveStreamHandle, false)) { Un4seen.Bass.BASS_CHANNELINFO info = new Un4seen.Bass.BASS_CHANNELINFO(); Un4seen.Bass.Bass.BASS_ChannelGetInfo(ActiveStreamHandle, info); } #if DEBUG else { Debug.WriteLine("Error={0}", Un4seen.Bass.Bass.BASS_ErrorGetCode()); } #endif }
/// <summary> /// 打开网络地址 /// </summary> /// <param name="url">URL地址</param> public void OpenUrlAsync(string url) { openningFile = url; //Debug.WriteLine("已调用BassEngine.OpenUrlAsync()"); Stop(); pendingOperation = PendingOperation.None; onlineFileWorker = new Thread(new ThreadStart(() => { int handle = Un4seen.Bass.Bass.BASS_StreamCreateURL(url, 0, Un4seen.Bass.BASSFlag.BASS_DEFAULT, null, IntPtr.Zero); Application.Current.Dispatcher.BeginInvoke(new Action(() => { if (handle != 0) { if (openningFile == url) //该文件为正在打开的文件 { ActiveStreamHandle = handle; ChannelLength = TimeSpan.FromSeconds(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(ActiveStreamHandle, Un4seen.Bass.Bass.BASS_ChannelGetLength(ActiveStreamHandle, 0))); Un4seen.Bass.BASS_CHANNELINFO info = new Un4seen.Bass.BASS_CHANNELINFO(); Un4seen.Bass.Bass.BASS_ChannelGetInfo(ActiveStreamHandle, info); sampleFrequency = info.freq; int syncHandle = Un4seen.Bass.Bass.BASS_ChannelSetSync(ActiveStreamHandle, Un4seen.Bass.BASSSync.BASS_SYNC_END, 0, endTrackSyncProc, IntPtr.Zero); if (syncHandle == 0) throw new ArgumentException("Error establishing End Sync on file stream.", "path"); CanPlay = true; RaiseOpenSucceededEvent(); switch (pendingOperation) { case PendingOperation.None: break; case PendingOperation.Play: Play(); break; case PendingOperation.Pause: Pause(); break; default: break; } } else //该文件不是正在打开的文件(即文件已过时,可能的原因是UI线程较忙,调用onlineFileWorker.Abort()时BeginInvoke的内容已提交,但还未执行) { if (!Un4seen.Bass.Bass.BASS_StreamFree(handle)) { Debug.WriteLine("BASS_StreamFree失败:" + Un4seen.Bass.Bass.BASS_ErrorGetCode()); } //Debug.WriteLine("已调用BASS_StreamFree()"); } } else { Debug.WriteLine(Un4seen.Bass.Bass.BASS_ErrorGetCode()); RaiseOpenFailedEvent(); } })); onlineFileWorker = null; })); onlineFileWorker.IsBackground = true; onlineFileWorker.Start(); }
/// <summary> /// 打开文件 /// </summary> /// <param name="filename">文件名</param> public void OpenFile(string filename) { openningFile = filename; //Debug.WriteLine("已调用BassEngine.OpenFile()"); Stop(); pendingOperation = PendingOperation.None; int handle = Un4seen.Bass.Bass.BASS_StreamCreateFile(filename, 0, 0, Un4seen.Bass.BASSFlag.BASS_DEFAULT); if (handle != 0) { ActiveStreamHandle = handle; ChannelLength = TimeSpan.FromSeconds(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(ActiveStreamHandle, Un4seen.Bass.Bass.BASS_ChannelGetLength(ActiveStreamHandle, 0))); Un4seen.Bass.BASS_CHANNELINFO info = new Un4seen.Bass.BASS_CHANNELINFO(); Un4seen.Bass.Bass.BASS_ChannelGetInfo(ActiveStreamHandle, info); sampleFrequency = info.freq; int syncHandle = Un4seen.Bass.Bass.BASS_ChannelSetSync(ActiveStreamHandle, Un4seen.Bass.BASSSync.BASS_SYNC_END, 0, endTrackSyncProc, IntPtr.Zero); if (syncHandle == 0) throw new ArgumentException("Error establishing End Sync on file stream.", "path"); CanPlay = true; RaiseOpenSucceededEvent(); switch (pendingOperation) { case PendingOperation.None: break; case PendingOperation.Play: Play(); break; case PendingOperation.Pause: Pause(); break; default: break; } } else { RaiseOpenFailedEvent(); } }
/// <summary> /// 打开网络地址 /// </summary> /// <param name="url">URL地址</param> public void OpenUrlAsync(string url) { openningFile = url; //Debug.WriteLine("已调用BassEngine.OpenUrlAsync()"); Stop(); pendingOperation = PendingOperation.None; onlineFileWorker = new Thread(new ThreadStart(() => { int handle = Un4seen.Bass.Bass.BASS_StreamCreateURL(url, 0, openUrlConfig, null, IntPtr.Zero); Application.Current.Dispatcher.BeginInvoke(new Action(() => { if (handle != 0) { if (openningFile == url) //该文件为正在打开的文件 { ActiveStreamHandle = handle; ChannelLength = TimeSpan.FromSeconds(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(ActiveStreamHandle, Un4seen.Bass.Bass.BASS_ChannelGetLength(ActiveStreamHandle, 0))); Un4seen.Bass.BASS_CHANNELINFO info = new Un4seen.Bass.BASS_CHANNELINFO(); Un4seen.Bass.Bass.BASS_ChannelGetInfo(ActiveStreamHandle, info); sampleFrequency = info.freq; int syncHandle = Un4seen.Bass.Bass.BASS_ChannelSetSync(ActiveStreamHandle, Un4seen.Bass.BASSSync.BASS_SYNC_END, 0, endTrackSyncProc, IntPtr.Zero); if (syncHandle == 0) { throw new ArgumentException("Error establishing End Sync on file stream.", "url"); } CanPlay = true; RaiseOpenSucceededEvent(); switch (pendingOperation) { case PendingOperation.None: break; case PendingOperation.Play: Play(); break; case PendingOperation.Pause: Pause(); break; default: break; } } else //该文件不是正在打开的文件(即文件已过时,可能的原因是UI线程较忙,调用onlineFileWorker.Abort()时BeginInvoke的内容已提交,但还未执行) { if (!Un4seen.Bass.Bass.BASS_StreamFree(handle)) { Debug.WriteLine("BASS_StreamFree失败:" + Un4seen.Bass.Bass.BASS_ErrorGetCode()); } //Debug.WriteLine("已调用BASS_StreamFree()"); } } else { Debug.WriteLine(Un4seen.Bass.Bass.BASS_ErrorGetCode()); RaiseOpenFailedEvent(); } })); onlineFileWorker = null; })); onlineFileWorker.IsBackground = true; onlineFileWorker.Start(); }