c# winmm.dll 音乐线程播放

这个博客介绍了如何使用多线程控制音乐播放,通过`TopQueue.MucicPlayConcurrentQueue`进行音乐文件的入队和出队操作。`MusicPlaybackConsumer`类包含了播放、暂停和停止音乐的函数,并且使用`mciSendString` API来实现。在窗体线程中,通过循环检查队列并播放音乐,确保了线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/// <summary>
    ///本类直接调用多线程无效  TopQueue.MucicPlayConcurrentQueue.Enqueue(声音序号);  声音放在debug下 FrmLogin 窗体下有出队列操作
    /// </summary>
    public class MusicPlaybackConsumer
    {
        private static string MUSIC_PATH = "music/";
        private static void Play(string fileName)
        {
            var a = mciSendString("close all", "", 0, 0);
            var b = mciSendString("open " + fileName + " alias media", "", 0, 0);
            var c = mciSendString("play media", "", 0, 0);
        }
        /// <summary>   
        /// 暂停   
        /// </summary>   
        private void Pause()
        {
            mciSendString("pause media", "", 0, 0);
        }
        /// <summary>   
        /// 停止   
        /// </summary>   
        private void Stop()
        {
            mciSendString("close media", "", 0, 0);
        }
        /// <summary>   
        /// API函数     DLL win自带不需要放入debug
        /// </summary>   
        [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
        private static extern int mciSendString(
            string lpstrCommand,
            string lpstrReturnString,
            int uReturnLength,
            int hwndCallback
        );
        /// <param name="musicPlaybackType"></param>
        /// <returns></returns>
        public static ResultInfo<string> MusicPlayback(int musicPlaybackType)
        {
            ResultInfo<string> result = new ResultInfo<string>();
            try
            {
                string fileName = "";
                switch (musicPlaybackType)
                {
                    case 1://
                        fileName = "a.mp3";
                        break;
                    case 2://
                        fileName = "fffff.mp3";
                        break;
                    case 3:/
                        fileName = "ssss.mp3";
                        break;
                    case 4://
                        fileName = "dddd.mp3";
                        break;
                    case 5://
                        fileName = "xxxxx.mp3";
                        break;
                    default:
                        result.Message = $"未知编号{musicPlaybackType}";
                        return result;
                }

                Play(MUSIC_PATH + fileName);
                result.IsSuccess = true;
                result.Message = "播放成功";
                return result;
            }
            catch (Exception ex)
            {
                result.Message = $"播放异常{ex.Message}";
                return result;
            }
        }

找个窗体线程下 或者 控制线程下

 Task.Factory.StartNew(() =>
            {
                Logger.Info("开启播放消息");
                while (true)
                {
                        if (TopQueue.MucicPlayConcurrentQueue.TryDequeue(out int palyNumber))
                        {
                            Invoke(new Action(() => { MusicPlaybackConsumer.MusicPlayback(palyNumber); }));
                        }
                        Thread.Sleep(500);
                }
            });

 public class TopQueue
    {
        public static ConcurrentQueue<int> MucicPlayConcurrentQueue = new ConcurrentQueue<int>();
    }

TopQueue.MucicPlayConcurrentQueue.Enqueue(4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值