游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5032|回复: 0

请教一个FMOD的问题

[复制链接]

2

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-5-1 23:02:00 | 显示全部楼层 |阅读模式
在做一个播放Mp3的程序(c#),功能很简单,就是普通的播放,停止,暂停,向前,向后,还有一个TrackBar可以进行进度的调节。
写了一个clsMusic类专门负责FMOD相关的操作。
平时操作都正常,但是进行了channel.stop操作后再次播放时就有问题。
问题如下:
1)音乐自行播放结束或者点击停止(channel,stop)后,调节TrackBar后出现错误。
   这个错误总出现在下面代码的“MC00027”位置。
2)以很高的频率进行,停止,播放操作(就是点击完播放后立刻点击停止,再立刻点击播放.....)
会出现错误。

以上两种问题返回的错误为如下三种,其中头两种出现频率高,第三种频率低。
FMOD_ERR_INVALID_HANDLE
FMOD_ERR_INVALID_PARAM
FMOD_ERR_OUTPUT_DRIVERCALL

贴出部分代码如下,希望能得到您的指点,先谢谢了!

下面代码中,
FmodRun() 为线程函数,其他函数都是通过窗口线程进行调用的。
有几个结构和方法是负责处理错误的,不影响您的阅读,也不影响程序。



  1. /// <summary>
  2.         /// 初始化函数
  3.         /// </summary>
  4.         public ErrorParam FmodInit()
  5.         {
  6.             uint version = 0;
  7.             FMOD.RESULT result;

  8.             /*
  9.                 Global Settings
  10.             */
  11.             result = FMOD.Factory.System_Create(ref system);
  12.             ERRCHECK(result,ref ep, "MC00001", "FMOD0001");
  13.             if (ep.isError) return ep;

  14.             result = system.getVersion(ref version);
  15.             ERRCHECK(result, ref ep, "MC00002", "FMOD0001");
  16.             if (ep.isError) return ep;
  17.             if (version < FMOD.VERSION.number)
  18.             {
  19.                 //MessageBox.Show("Error!  You are using an old version of FMOD " + version.ToString("X") + ".  This program requires " + FMOD.VERSION.number.ToString("X") + ".");
  20.                 //Application.Exit();
  21.                 clsLanguage.SetErrorParam(ref ep, "MC00006", "FMOD0002", version.ToString("X") + "," + FMOD.VERSION.number.ToString("X"));
  22.                 return ep;
  23.             }

  24.             result = system.init(32, FMOD.INITFLAG.NORMAL, (IntPtr)null);
  25.             ERRCHECK(result, ref ep, "MC00003", "FMOD0001");
  26.             if (ep.isError) return ep;

  27.             result = system.createSound(m_strMusicPath, (FMOD.MODE._2D | FMOD.MODE.HARDWARE | FMOD.MODE.CREATESTREAM), ref sound);
  28.             //result = system.createSound(m_strMusicPath, FMOD.MODE.HARDWARE, ref sound);
  29.             ERRCHECK(result, ref ep, "MC00004", "FMOD0001");
  30.             if (ep.isError) return ep;

  31.             result = sound.getLength(ref musiclength, FMOD.TIMEUNIT.MS);
  32.             ERRCHECK(result, ref ep, "MC00021", "FMOD0001");
  33.             if (ep.isError) return ep;

  34.             //设置音乐条最大刻度
  35.             mct.SetSoundTrackBarLength((int)musiclength);
  36.             if (musicthread == null)
  37.             {
  38.                 musicthread = new Thread(this.FmodRun);
  39.             }
  40.             isPlayMusic = true;
  41.             musicthread.Start();
  42.             clsLanguage.GetOKErrorParam(ref ep);
  43.             return ep;
  44.         }


  45. /// <summary>
  46.         /// 线程执行函数
  47.         /// </summary>
  48.         private void FmodRun()
  49.         {
  50.             while (isPlayMusic)
  51.             {
  52.                 uint ms = 0;

  53.                 if (channel != null)
  54.                 {
  55.                     //result = channel.isPlaying(ref playing);
  56.                     //if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  57.                     //{
  58.                     //    ERRCHECK(result);
  59.                     //}

  60.                     //result = channel.getPaused(ref paused);
  61.                     //if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  62.                     //{
  63.                     //    ERRCHECK(result);
  64.                     //}

  65.                     result = channel.getPosition(ref ms, FMOD.TIMEUNIT.MS);
  66.                     if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  67.                     {
  68.                         ERRCHECK(result, ref ep, "MC00011", "FMOD0001");
  69.                         clsNotify.Instance().SendMessage(ep);
  70.                         isPlayMusic = false;
  71.                         return;
  72.                     }
  73.                     if (!mct.isSoundCtrl)
  74.                     {

  75.                         mct.SetSoundInfo((int)ms);
  76.                         mct.SetSoundTrackValue((int)ms);
  77.                     }
  78.                     
  79.                 }

  80.                 //statusBar.Text = "Time " + (ms / 1000 / 60) + ":" + (ms / 1000 % 60) + ":" + (ms / 10 % 100) + "/" + (lenms / 1000 / 60) + ":" + (lenms / 1000 % 60) + ":" + (lenms / 10 % 100) + " : " + (paused ? "Paused " : playing ? "Playing" : "Stopped");

  81.                 if (system != null)
  82.                 {
  83.                     system.update();
  84.                 }
  85.                 Thread.Sleep(10);
  86.             }
  87.         }


  88. /// <summary>
  89.         /// 设置音乐当前的位置,TrackBar调整数值后调用
  90.         /// </summary>
  91.         /// <param name="pos">要设置的位置</param>
  92.         public ErrorParam setPosition(uint pos)
  93.         {
  94.             if (channel != null)
  95.             {
  96.                 bool isplay = false;
  97.                 if (pos >= musiclength) pos = 0;
  98.                 result = channel.isPlaying(ref isplay);
  99.                 switch (result)
  100.                 {
  101.                     case FMOD.RESULT.OK:
  102.                         if (isplay)
  103.                         {
  104.                             result = channel.setPosition(pos, FMOD.TIMEUNIT.MS);
  105.                             if (result != FMOD.RESULT.OK)
  106.                             {
  107.                                 ERRCHECK(result, ref ep, "MC00030", "FMOD0001");
  108.                                 return ep;
  109.                             }
  110.                         }
  111.                         break;
  112.                     case FMOD.RESULT.ERR_INVALID_HANDLE:
  113.                         result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, true, ref channel);
  114.                         if (result != FMOD.RESULT.OK)
  115.                         {
  116.                             ERRCHECK(result, ref ep, "MC00027", "FMOD0001");
  117.                             return ep;
  118.                         }
  119.                         result = channel.setPosition(pos, FMOD.TIMEUNIT.MS);
  120.                         if (result != FMOD.RESULT.OK)
  121.                         {
  122.                             ERRCHECK(result, ref ep, "MC00029", "FMOD0001");
  123.                             return ep;
  124.                         }
  125.                         break;
  126.                     default:
  127.                         ERRCHECK(result, ref ep, "MC00028", "FMOD0001");
  128.                         return ep;
  129.                 }

  130.             }
  131.             clsLanguage.GetOKErrorParam(ref ep);
  132.             return ep;
  133.         }


  134. /// <summary>
  135.         /// 播放
  136.         /// </summary>
  137.         public ErrorParam Play()
  138.         {

  139.             if (channel != null)
  140.             {//已经播放了
  141.                 bool paused = false;
  142.                 bool isplay = false;
  143.                 //获得播放/暂停状态
  144.                 result = channel.isPlaying(ref isplay);
  145.                 switch (result)
  146.                 {
  147.                     case FMOD.RESULT.OK:
  148.                         if (isplay)
  149.                         {//已经播放
  150.                             result = channel.getPaused(ref paused);
  151.                             if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  152.                             {
  153.                                 ERRCHECK(result, ref ep, "MC00006", "FMOD0001");
  154.                                 return ep;
  155.                             }
  156.                             if (paused)
  157.                             {//暂停
  158.                                 result = channel.setPaused(false);
  159.                                 if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  160.                                 {
  161.                                     ERRCHECK(result, ref ep, "MC00007", "FMOD0001");
  162.                                     return ep;
  163.                                 }
  164.                                 clsLanguage.GetOKErrorParam(ref ep);
  165.                                 return ep;
  166.                             }
  167.                             else
  168.                             {//播放中
  169.                                 clsLanguage.GetOKErrorParam(ref ep);
  170.                                 return ep;
  171.                             }
  172.                         }
  173.                         else
  174.                         {//还未播放
  175.                             result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, true, ref channel);
  176.                             if (result != FMOD.RESULT.OK)
  177.                             {
  178.                                 ERRCHECK(result, ref ep, "MC00008", "FMOD0001");
  179.                                 return ep;
  180.                             }
  181.                            
  182.                         }
  183.                         break;
  184.                     case FMOD.RESULT.ERR_INVALID_HANDLE:
  185.                         result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, true, ref channel);
  186.                         if (result != FMOD.RESULT.OK)
  187.                         {
  188.                             ERRCHECK(result, ref ep, "MC00026", "FMOD0001");
  189.                             return ep;
  190.                         }
  191.                         break;
  192.                     default:
  193.                         ERRCHECK(result, ref ep, "MC00009", "FMOD0001");
  194.                         return ep;
  195.                 }

  196.             }
  197.             else
  198.             {//从未播放过
  199.                 result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, true, ref channel);
  200.                 if (result != FMOD.RESULT.OK)
  201.                 {
  202.                     ERRCHECK(result, ref ep, "MC00010", "FMOD0001");
  203.                     return ep;
  204.                 }
  205.             }
  206.             int pos = mct.GetSoundTrackValue();
  207.             if (pos == (int)musiclength) pos = 0;
  208.             result = channel.setPosition((uint)pos, FMOD.TIMEUNIT.MS);
  209.             if (result != FMOD.RESULT.OK)
  210.             {
  211.                 ERRCHECK(result, ref ep, "MC00024", "FMOD0001");
  212.                 return ep;
  213.             }
  214.             result = channel.setPaused(false);
  215.             if (result != FMOD.RESULT.OK)
  216.             {
  217.                 ERRCHECK(result, ref ep, "MC00025", "FMOD0001");
  218.                 return ep;
  219.             }
  220.             clsLanguage.GetOKErrorParam(ref ep);
  221.             return ep;
  222.         }


  223. /// <summary>
  224.         /// 停止播放
  225.         /// </summary>
  226.         /// <returns></returns>
  227.         public ErrorParam Stop()
  228.         {
  229.             if (channel != null)
  230.             {
  231.                 result = channel.stop();
  232.                 if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
  233.                 {
  234.                     ERRCHECK(result, ref ep, "MC00023", "FMOD0001");
  235.                     return ep;
  236.                 }
  237.             }
  238.             clsLanguage.GetOKErrorParam(ref ep);
  239.             return ep;
  240.         }

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-22 22:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表