SoundManager.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using GameFramework.Resource;
  8. using System;
  9. using System.Collections.Generic;
  10. namespace GameFramework.Sound
  11. {
  12. /// <summary>
  13. /// 声音管理器。
  14. /// </summary>
  15. internal sealed partial class SoundManager : GameFrameworkModule, ISoundManager
  16. {
  17. private readonly Dictionary<string, SoundGroup> m_SoundGroups;
  18. private readonly List<int> m_SoundsBeingLoaded;
  19. private readonly HashSet<int> m_SoundsToReleaseOnLoad;
  20. private readonly LoadAssetCallbacks m_LoadAssetCallbacks;
  21. private IResourceManager m_ResourceManager;
  22. private ISoundHelper m_SoundHelper;
  23. private int m_Serial;
  24. private EventHandler<PlaySoundSuccessEventArgs> m_PlaySoundSuccessEventHandler;
  25. private EventHandler<PlaySoundFailureEventArgs> m_PlaySoundFailureEventHandler;
  26. private EventHandler<PlaySoundUpdateEventArgs> m_PlaySoundUpdateEventHandler;
  27. private EventHandler<PlaySoundDependencyAssetEventArgs> m_PlaySoundDependencyAssetEventHandler;
  28. /// <summary>
  29. /// 初始化声音管理器的新实例。
  30. /// </summary>
  31. public SoundManager()
  32. {
  33. m_SoundGroups = new Dictionary<string, SoundGroup>(StringComparer.Ordinal);
  34. m_SoundsBeingLoaded = new List<int>();
  35. m_SoundsToReleaseOnLoad = new HashSet<int>();
  36. m_LoadAssetCallbacks = new LoadAssetCallbacks(LoadAssetSuccessCallback, LoadAssetFailureCallback, LoadAssetUpdateCallback, LoadAssetDependencyAssetCallback);
  37. m_ResourceManager = null;
  38. m_SoundHelper = null;
  39. m_Serial = 0;
  40. m_PlaySoundSuccessEventHandler = null;
  41. m_PlaySoundFailureEventHandler = null;
  42. m_PlaySoundUpdateEventHandler = null;
  43. m_PlaySoundDependencyAssetEventHandler = null;
  44. }
  45. /// <summary>
  46. /// 获取声音组数量。
  47. /// </summary>
  48. public int SoundGroupCount
  49. {
  50. get
  51. {
  52. return m_SoundGroups.Count;
  53. }
  54. }
  55. /// <summary>
  56. /// 播放声音成功事件。
  57. /// </summary>
  58. public event EventHandler<PlaySoundSuccessEventArgs> PlaySoundSuccess
  59. {
  60. add
  61. {
  62. m_PlaySoundSuccessEventHandler += value;
  63. }
  64. remove
  65. {
  66. m_PlaySoundSuccessEventHandler -= value;
  67. }
  68. }
  69. /// <summary>
  70. /// 播放声音失败事件。
  71. /// </summary>
  72. public event EventHandler<PlaySoundFailureEventArgs> PlaySoundFailure
  73. {
  74. add
  75. {
  76. m_PlaySoundFailureEventHandler += value;
  77. }
  78. remove
  79. {
  80. m_PlaySoundFailureEventHandler -= value;
  81. }
  82. }
  83. /// <summary>
  84. /// 播放声音更新事件。
  85. /// </summary>
  86. public event EventHandler<PlaySoundUpdateEventArgs> PlaySoundUpdate
  87. {
  88. add
  89. {
  90. m_PlaySoundUpdateEventHandler += value;
  91. }
  92. remove
  93. {
  94. m_PlaySoundUpdateEventHandler -= value;
  95. }
  96. }
  97. /// <summary>
  98. /// 播放声音时加载依赖资源事件。
  99. /// </summary>
  100. public event EventHandler<PlaySoundDependencyAssetEventArgs> PlaySoundDependencyAsset
  101. {
  102. add
  103. {
  104. m_PlaySoundDependencyAssetEventHandler += value;
  105. }
  106. remove
  107. {
  108. m_PlaySoundDependencyAssetEventHandler -= value;
  109. }
  110. }
  111. /// <summary>
  112. /// 声音管理器轮询。
  113. /// </summary>
  114. /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
  115. /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
  116. internal override void Update(float elapseSeconds, float realElapseSeconds)
  117. {
  118. }
  119. /// <summary>
  120. /// 关闭并清理声音管理器。
  121. /// </summary>
  122. internal override void Shutdown()
  123. {
  124. StopAllLoadedSounds();
  125. m_SoundGroups.Clear();
  126. m_SoundsBeingLoaded.Clear();
  127. m_SoundsToReleaseOnLoad.Clear();
  128. }
  129. /// <summary>
  130. /// 设置资源管理器。
  131. /// </summary>
  132. /// <param name="resourceManager">资源管理器。</param>
  133. public void SetResourceManager(IResourceManager resourceManager)
  134. {
  135. if (resourceManager == null)
  136. {
  137. throw new GameFrameworkException("Resource manager is invalid.");
  138. }
  139. m_ResourceManager = resourceManager;
  140. }
  141. /// <summary>
  142. /// 设置声音辅助器。
  143. /// </summary>
  144. /// <param name="soundHelper">声音辅助器。</param>
  145. public void SetSoundHelper(ISoundHelper soundHelper)
  146. {
  147. if (soundHelper == null)
  148. {
  149. throw new GameFrameworkException("Sound helper is invalid.");
  150. }
  151. m_SoundHelper = soundHelper;
  152. }
  153. /// <summary>
  154. /// 是否存在指定声音组。
  155. /// </summary>
  156. /// <param name="soundGroupName">声音组名称。</param>
  157. /// <returns>指定声音组是否存在。</returns>
  158. public bool HasSoundGroup(string soundGroupName)
  159. {
  160. if (string.IsNullOrEmpty(soundGroupName))
  161. {
  162. throw new GameFrameworkException("Sound group name is invalid.");
  163. }
  164. return m_SoundGroups.ContainsKey(soundGroupName);
  165. }
  166. /// <summary>
  167. /// 获取指定声音组。
  168. /// </summary>
  169. /// <param name="soundGroupName">声音组名称。</param>
  170. /// <returns>要获取的声音组。</returns>
  171. public ISoundGroup GetSoundGroup(string soundGroupName)
  172. {
  173. if (string.IsNullOrEmpty(soundGroupName))
  174. {
  175. throw new GameFrameworkException("Sound group name is invalid.");
  176. }
  177. SoundGroup soundGroup = null;
  178. if (m_SoundGroups.TryGetValue(soundGroupName, out soundGroup))
  179. {
  180. return soundGroup;
  181. }
  182. return null;
  183. }
  184. /// <summary>
  185. /// 获取所有声音组。
  186. /// </summary>
  187. /// <returns>所有声音组。</returns>
  188. public ISoundGroup[] GetAllSoundGroups()
  189. {
  190. int index = 0;
  191. ISoundGroup[] results = new ISoundGroup[m_SoundGroups.Count];
  192. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  193. {
  194. results[index++] = soundGroup.Value;
  195. }
  196. return results;
  197. }
  198. /// <summary>
  199. /// 获取所有声音组。
  200. /// </summary>
  201. /// <param name="results">所有声音组。</param>
  202. public void GetAllSoundGroups(List<ISoundGroup> results)
  203. {
  204. if (results == null)
  205. {
  206. throw new GameFrameworkException("Results is invalid.");
  207. }
  208. results.Clear();
  209. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  210. {
  211. results.Add(soundGroup.Value);
  212. }
  213. }
  214. /// <summary>
  215. /// 增加声音组。
  216. /// </summary>
  217. /// <param name="soundGroupName">声音组名称。</param>
  218. /// <param name="soundGroupHelper">声音组辅助器。</param>
  219. /// <returns>是否增加声音组成功。</returns>
  220. public bool AddSoundGroup(string soundGroupName, ISoundGroupHelper soundGroupHelper)
  221. {
  222. return AddSoundGroup(soundGroupName, false, Constant.DefaultMute, Constant.DefaultVolume, soundGroupHelper);
  223. }
  224. /// <summary>
  225. /// 增加声音组。
  226. /// </summary>
  227. /// <param name="soundGroupName">声音组名称。</param>
  228. /// <param name="soundGroupAvoidBeingReplacedBySamePriority">声音组中的声音是否避免被同优先级声音替换。</param>
  229. /// <param name="soundGroupMute">声音组是否静音。</param>
  230. /// <param name="soundGroupVolume">声音组音量。</param>
  231. /// <param name="soundGroupHelper">声音组辅助器。</param>
  232. /// <returns>是否增加声音组成功。</returns>
  233. public bool AddSoundGroup(string soundGroupName, bool soundGroupAvoidBeingReplacedBySamePriority, bool soundGroupMute, float soundGroupVolume, ISoundGroupHelper soundGroupHelper)
  234. {
  235. if (string.IsNullOrEmpty(soundGroupName))
  236. {
  237. throw new GameFrameworkException("Sound group name is invalid.");
  238. }
  239. if (soundGroupHelper == null)
  240. {
  241. throw new GameFrameworkException("Sound group helper is invalid.");
  242. }
  243. if (HasSoundGroup(soundGroupName))
  244. {
  245. return false;
  246. }
  247. SoundGroup soundGroup = new SoundGroup(soundGroupName, soundGroupHelper)
  248. {
  249. AvoidBeingReplacedBySamePriority = soundGroupAvoidBeingReplacedBySamePriority,
  250. Mute = soundGroupMute,
  251. Volume = soundGroupVolume
  252. };
  253. m_SoundGroups.Add(soundGroupName, soundGroup);
  254. return true;
  255. }
  256. /// <summary>
  257. /// 增加声音代理辅助器。
  258. /// </summary>
  259. /// <param name="soundGroupName">声音组名称。</param>
  260. /// <param name="soundAgentHelper">要增加的声音代理辅助器。</param>
  261. public void AddSoundAgentHelper(string soundGroupName, ISoundAgentHelper soundAgentHelper)
  262. {
  263. if (m_SoundHelper == null)
  264. {
  265. throw new GameFrameworkException("You must set sound helper first.");
  266. }
  267. SoundGroup soundGroup = (SoundGroup)GetSoundGroup(soundGroupName);
  268. if (soundGroup == null)
  269. {
  270. throw new GameFrameworkException(Utility.Text.Format("Sound group '{0}' is not exist.", soundGroupName));
  271. }
  272. soundGroup.AddSoundAgentHelper(m_SoundHelper, soundAgentHelper);
  273. }
  274. /// <summary>
  275. /// 获取所有正在加载声音的序列编号。
  276. /// </summary>
  277. /// <returns>所有正在加载声音的序列编号。</returns>
  278. public int[] GetAllLoadingSoundSerialIds()
  279. {
  280. return m_SoundsBeingLoaded.ToArray();
  281. }
  282. /// <summary>
  283. /// 获取所有正在加载声音的序列编号。
  284. /// </summary>
  285. /// <param name="results">所有正在加载声音的序列编号。</param>
  286. public void GetAllLoadingSoundSerialIds(List<int> results)
  287. {
  288. if (results == null)
  289. {
  290. throw new GameFrameworkException("Results is invalid.");
  291. }
  292. results.Clear();
  293. results.AddRange(m_SoundsBeingLoaded);
  294. }
  295. /// <summary>
  296. /// 是否正在加载声音。
  297. /// </summary>
  298. /// <param name="serialId">声音序列编号。</param>
  299. /// <returns>是否正在加载声音。</returns>
  300. public bool IsLoadingSound(int serialId)
  301. {
  302. return m_SoundsBeingLoaded.Contains(serialId);
  303. }
  304. /// <summary>
  305. /// 播放声音。
  306. /// </summary>
  307. /// <param name="soundAssetName">声音资源名称。</param>
  308. /// <param name="soundGroupName">声音组名称。</param>
  309. /// <returns>声音的序列编号。</returns>
  310. public int PlaySound(string soundAssetName, string soundGroupName)
  311. {
  312. return PlaySound(soundAssetName, soundGroupName, Resource.Constant.DefaultPriority, null, null);
  313. }
  314. /// <summary>
  315. /// 播放声音。
  316. /// </summary>
  317. /// <param name="soundAssetName">声音资源名称。</param>
  318. /// <param name="soundGroupName">声音组名称。</param>
  319. /// <param name="priority">加载声音资源的优先级。</param>
  320. /// <returns>声音的序列编号。</returns>
  321. public int PlaySound(string soundAssetName, string soundGroupName, int priority)
  322. {
  323. return PlaySound(soundAssetName, soundGroupName, priority, null, null);
  324. }
  325. /// <summary>
  326. /// 播放声音。
  327. /// </summary>
  328. /// <param name="soundAssetName">声音资源名称。</param>
  329. /// <param name="soundGroupName">声音组名称。</param>
  330. /// <param name="playSoundParams">播放声音参数。</param>
  331. /// <returns>声音的序列编号。</returns>
  332. public int PlaySound(string soundAssetName, string soundGroupName, PlaySoundParams playSoundParams)
  333. {
  334. return PlaySound(soundAssetName, soundGroupName, Resource.Constant.DefaultPriority, playSoundParams, null);
  335. }
  336. /// <summary>
  337. /// 播放声音。
  338. /// </summary>
  339. /// <param name="soundAssetName">声音资源名称。</param>
  340. /// <param name="soundGroupName">声音组名称。</param>
  341. /// <param name="userData">用户自定义数据。</param>
  342. /// <returns>声音的序列编号。</returns>
  343. public int PlaySound(string soundAssetName, string soundGroupName, object userData)
  344. {
  345. return PlaySound(soundAssetName, soundGroupName, Resource.Constant.DefaultPriority, null, userData);
  346. }
  347. /// <summary>
  348. /// 播放声音。
  349. /// </summary>
  350. /// <param name="soundAssetName">声音资源名称。</param>
  351. /// <param name="soundGroupName">声音组名称。</param>
  352. /// <param name="priority">加载声音资源的优先级。</param>
  353. /// <param name="playSoundParams">播放声音参数。</param>
  354. /// <returns>声音的序列编号。</returns>
  355. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams)
  356. {
  357. return PlaySound(soundAssetName, soundGroupName, priority, playSoundParams, null);
  358. }
  359. /// <summary>
  360. /// 播放声音。
  361. /// </summary>
  362. /// <param name="soundAssetName">声音资源名称。</param>
  363. /// <param name="soundGroupName">声音组名称。</param>
  364. /// <param name="priority">加载声音资源的优先级。</param>
  365. /// <param name="userData">用户自定义数据。</param>
  366. /// <returns>声音的序列编号。</returns>
  367. public int PlaySound(string soundAssetName, string soundGroupName, int priority, object userData)
  368. {
  369. return PlaySound(soundAssetName, soundGroupName, priority, null, userData);
  370. }
  371. /// <summary>
  372. /// 播放声音。
  373. /// </summary>
  374. /// <param name="soundAssetName">声音资源名称。</param>
  375. /// <param name="soundGroupName">声音组名称。</param>
  376. /// <param name="playSoundParams">播放声音参数。</param>
  377. /// <param name="userData">用户自定义数据。</param>
  378. /// <returns>声音的序列编号。</returns>
  379. public int PlaySound(string soundAssetName, string soundGroupName, PlaySoundParams playSoundParams, object userData)
  380. {
  381. return PlaySound(soundAssetName, soundGroupName, Resource.Constant.DefaultPriority, playSoundParams, userData);
  382. }
  383. /// <summary>
  384. /// 播放声音。
  385. /// </summary>
  386. /// <param name="soundAssetName">声音资源名称。</param>
  387. /// <param name="soundGroupName">声音组名称。</param>
  388. /// <param name="priority">加载声音资源的优先级。</param>
  389. /// <param name="playSoundParams">播放声音参数。</param>
  390. /// <param name="userData">用户自定义数据。</param>
  391. /// <returns>声音的序列编号。</returns>
  392. public int PlaySound(string soundAssetName, string soundGroupName, int priority, PlaySoundParams playSoundParams, object userData)
  393. {
  394. if (m_ResourceManager == null)
  395. {
  396. throw new GameFrameworkException("You must set resource manager first.");
  397. }
  398. if (m_SoundHelper == null)
  399. {
  400. throw new GameFrameworkException("You must set sound helper first.");
  401. }
  402. if (playSoundParams == null)
  403. {
  404. playSoundParams = PlaySoundParams.Create();
  405. }
  406. int serialId = ++m_Serial;
  407. PlaySoundErrorCode? errorCode = null;
  408. string errorMessage = null;
  409. SoundGroup soundGroup = (SoundGroup)GetSoundGroup(soundGroupName);
  410. if (soundGroup == null)
  411. {
  412. errorCode = PlaySoundErrorCode.SoundGroupNotExist;
  413. errorMessage = Utility.Text.Format("Sound group '{0}' is not exist.", soundGroupName);
  414. }
  415. else if (soundGroup.SoundAgentCount <= 0)
  416. {
  417. errorCode = PlaySoundErrorCode.SoundGroupHasNoAgent;
  418. errorMessage = Utility.Text.Format("Sound group '{0}' is have no sound agent.", soundGroupName);
  419. }
  420. if (errorCode.HasValue)
  421. {
  422. if (m_PlaySoundFailureEventHandler != null)
  423. {
  424. PlaySoundFailureEventArgs playSoundFailureEventArgs = PlaySoundFailureEventArgs.Create(serialId, soundAssetName, soundGroupName, playSoundParams, errorCode.Value, errorMessage, userData);
  425. m_PlaySoundFailureEventHandler(this, playSoundFailureEventArgs);
  426. ReferencePool.Release(playSoundFailureEventArgs);
  427. if (playSoundParams.Referenced)
  428. {
  429. ReferencePool.Release(playSoundParams);
  430. }
  431. return serialId;
  432. }
  433. throw new GameFrameworkException(errorMessage);
  434. }
  435. m_SoundsBeingLoaded.Add(serialId);
  436. m_ResourceManager.LoadAsset(soundAssetName, priority, m_LoadAssetCallbacks, PlaySoundInfo.Create(serialId, soundGroup, playSoundParams, userData));
  437. return serialId;
  438. }
  439. /// <summary>
  440. /// 停止播放声音。
  441. /// </summary>
  442. /// <param name="serialId">要停止播放声音的序列编号。</param>
  443. /// <returns>是否停止播放声音成功。</returns>
  444. public bool StopSound(int serialId)
  445. {
  446. return StopSound(serialId, Constant.DefaultFadeOutSeconds);
  447. }
  448. /// <summary>
  449. /// 停止播放声音。
  450. /// </summary>
  451. /// <param name="serialId">要停止播放声音的序列编号。</param>
  452. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  453. /// <returns>是否停止播放声音成功。</returns>
  454. public bool StopSound(int serialId, float fadeOutSeconds)
  455. {
  456. if (IsLoadingSound(serialId))
  457. {
  458. m_SoundsToReleaseOnLoad.Add(serialId);
  459. m_SoundsBeingLoaded.Remove(serialId);
  460. return true;
  461. }
  462. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  463. {
  464. if (soundGroup.Value.StopSound(serialId, fadeOutSeconds))
  465. {
  466. return true;
  467. }
  468. }
  469. return false;
  470. }
  471. /// <summary>
  472. /// 停止所有已加载的声音。
  473. /// </summary>
  474. public void StopAllLoadedSounds()
  475. {
  476. StopAllLoadedSounds(Constant.DefaultFadeOutSeconds);
  477. }
  478. /// <summary>
  479. /// 停止所有已加载的声音。
  480. /// </summary>
  481. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  482. public void StopAllLoadedSounds(float fadeOutSeconds)
  483. {
  484. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  485. {
  486. soundGroup.Value.StopAllLoadedSounds(fadeOutSeconds);
  487. }
  488. }
  489. /// <summary>
  490. /// 停止所有正在加载的声音。
  491. /// </summary>
  492. public void StopAllLoadingSounds()
  493. {
  494. foreach (int serialId in m_SoundsBeingLoaded)
  495. {
  496. m_SoundsToReleaseOnLoad.Add(serialId);
  497. }
  498. }
  499. /// <summary>
  500. /// 暂停播放声音。
  501. /// </summary>
  502. /// <param name="serialId">要暂停播放声音的序列编号。</param>
  503. public void PauseSound(int serialId)
  504. {
  505. PauseSound(serialId, Constant.DefaultFadeOutSeconds);
  506. }
  507. /// <summary>
  508. /// 暂停播放声音。
  509. /// </summary>
  510. /// <param name="serialId">要暂停播放声音的序列编号。</param>
  511. /// <param name="fadeOutSeconds">声音淡出时间,以秒为单位。</param>
  512. public void PauseSound(int serialId, float fadeOutSeconds)
  513. {
  514. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  515. {
  516. if (soundGroup.Value.PauseSound(serialId, fadeOutSeconds))
  517. {
  518. return;
  519. }
  520. }
  521. throw new GameFrameworkException(Utility.Text.Format("Can not find sound '{0}'.", serialId));
  522. }
  523. /// <summary>
  524. /// 恢复播放声音。
  525. /// </summary>
  526. /// <param name="serialId">要恢复播放声音的序列编号。</param>
  527. public void ResumeSound(int serialId)
  528. {
  529. ResumeSound(serialId, Constant.DefaultFadeInSeconds);
  530. }
  531. /// <summary>
  532. /// 恢复播放声音。
  533. /// </summary>
  534. /// <param name="serialId">要恢复播放声音的序列编号。</param>
  535. /// <param name="fadeInSeconds">声音淡入时间,以秒为单位。</param>
  536. public void ResumeSound(int serialId, float fadeInSeconds)
  537. {
  538. foreach (KeyValuePair<string, SoundGroup> soundGroup in m_SoundGroups)
  539. {
  540. if (soundGroup.Value.ResumeSound(serialId, fadeInSeconds))
  541. {
  542. return;
  543. }
  544. }
  545. throw new GameFrameworkException(Utility.Text.Format("Can not find sound '{0}'.", serialId));
  546. }
  547. private void LoadAssetSuccessCallback(string soundAssetName, object soundAsset, float duration, object userData)
  548. {
  549. PlaySoundInfo playSoundInfo = (PlaySoundInfo)userData;
  550. if (playSoundInfo == null)
  551. {
  552. throw new GameFrameworkException("Play sound info is invalid.");
  553. }
  554. if (m_SoundsToReleaseOnLoad.Contains(playSoundInfo.SerialId))
  555. {
  556. m_SoundsToReleaseOnLoad.Remove(playSoundInfo.SerialId);
  557. if (playSoundInfo.PlaySoundParams.Referenced)
  558. {
  559. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  560. }
  561. ReferencePool.Release(playSoundInfo);
  562. m_SoundHelper.ReleaseSoundAsset(soundAsset);
  563. return;
  564. }
  565. m_SoundsBeingLoaded.Remove(playSoundInfo.SerialId);
  566. PlaySoundErrorCode? errorCode = null;
  567. ISoundAgent soundAgent = playSoundInfo.SoundGroup.PlaySound(playSoundInfo.SerialId, soundAsset, playSoundInfo.PlaySoundParams, out errorCode);
  568. if (soundAgent != null)
  569. {
  570. if (m_PlaySoundSuccessEventHandler != null)
  571. {
  572. PlaySoundSuccessEventArgs playSoundSuccessEventArgs = PlaySoundSuccessEventArgs.Create(playSoundInfo.SerialId, soundAssetName, soundAgent, duration, playSoundInfo.UserData);
  573. m_PlaySoundSuccessEventHandler(this, playSoundSuccessEventArgs);
  574. ReferencePool.Release(playSoundSuccessEventArgs);
  575. }
  576. if (playSoundInfo.PlaySoundParams.Referenced)
  577. {
  578. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  579. }
  580. ReferencePool.Release(playSoundInfo);
  581. return;
  582. }
  583. m_SoundsToReleaseOnLoad.Remove(playSoundInfo.SerialId);
  584. m_SoundHelper.ReleaseSoundAsset(soundAsset);
  585. string errorMessage = Utility.Text.Format("Sound group '{0}' play sound '{1}' failure.", playSoundInfo.SoundGroup.Name, soundAssetName);
  586. if (m_PlaySoundFailureEventHandler != null)
  587. {
  588. PlaySoundFailureEventArgs playSoundFailureEventArgs = PlaySoundFailureEventArgs.Create(playSoundInfo.SerialId, soundAssetName, playSoundInfo.SoundGroup.Name, playSoundInfo.PlaySoundParams, errorCode.Value, errorMessage, playSoundInfo.UserData);
  589. m_PlaySoundFailureEventHandler(this, playSoundFailureEventArgs);
  590. ReferencePool.Release(playSoundFailureEventArgs);
  591. if (playSoundInfo.PlaySoundParams.Referenced)
  592. {
  593. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  594. }
  595. ReferencePool.Release(playSoundInfo);
  596. return;
  597. }
  598. if (playSoundInfo.PlaySoundParams.Referenced)
  599. {
  600. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  601. }
  602. ReferencePool.Release(playSoundInfo);
  603. throw new GameFrameworkException(errorMessage);
  604. }
  605. private void LoadAssetFailureCallback(string soundAssetName, LoadResourceStatus status, string errorMessage, object userData)
  606. {
  607. PlaySoundInfo playSoundInfo = (PlaySoundInfo)userData;
  608. if (playSoundInfo == null)
  609. {
  610. throw new GameFrameworkException("Play sound info is invalid.");
  611. }
  612. if (m_SoundsToReleaseOnLoad.Contains(playSoundInfo.SerialId))
  613. {
  614. m_SoundsToReleaseOnLoad.Remove(playSoundInfo.SerialId);
  615. if (playSoundInfo.PlaySoundParams.Referenced)
  616. {
  617. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  618. }
  619. return;
  620. }
  621. m_SoundsBeingLoaded.Remove(playSoundInfo.SerialId);
  622. string appendErrorMessage = Utility.Text.Format("Load sound failure, asset name '{0}', status '{1}', error message '{2}'.", soundAssetName, status, errorMessage);
  623. if (m_PlaySoundFailureEventHandler != null)
  624. {
  625. PlaySoundFailureEventArgs playSoundFailureEventArgs = PlaySoundFailureEventArgs.Create(playSoundInfo.SerialId, soundAssetName, playSoundInfo.SoundGroup.Name, playSoundInfo.PlaySoundParams, PlaySoundErrorCode.LoadAssetFailure, appendErrorMessage, playSoundInfo.UserData);
  626. m_PlaySoundFailureEventHandler(this, playSoundFailureEventArgs);
  627. ReferencePool.Release(playSoundFailureEventArgs);
  628. if (playSoundInfo.PlaySoundParams.Referenced)
  629. {
  630. ReferencePool.Release(playSoundInfo.PlaySoundParams);
  631. }
  632. return;
  633. }
  634. throw new GameFrameworkException(appendErrorMessage);
  635. }
  636. private void LoadAssetUpdateCallback(string soundAssetName, float progress, object userData)
  637. {
  638. PlaySoundInfo playSoundInfo = (PlaySoundInfo)userData;
  639. if (playSoundInfo == null)
  640. {
  641. throw new GameFrameworkException("Play sound info is invalid.");
  642. }
  643. if (m_PlaySoundUpdateEventHandler != null)
  644. {
  645. PlaySoundUpdateEventArgs playSoundUpdateEventArgs = PlaySoundUpdateEventArgs.Create(playSoundInfo.SerialId, soundAssetName, playSoundInfo.SoundGroup.Name, playSoundInfo.PlaySoundParams, progress, playSoundInfo.UserData);
  646. m_PlaySoundUpdateEventHandler(this, playSoundUpdateEventArgs);
  647. ReferencePool.Release(playSoundUpdateEventArgs);
  648. }
  649. }
  650. private void LoadAssetDependencyAssetCallback(string soundAssetName, string dependencyAssetName, int loadedCount, int totalCount, object userData)
  651. {
  652. PlaySoundInfo playSoundInfo = (PlaySoundInfo)userData;
  653. if (playSoundInfo == null)
  654. {
  655. throw new GameFrameworkException("Play sound info is invalid.");
  656. }
  657. if (m_PlaySoundDependencyAssetEventHandler != null)
  658. {
  659. PlaySoundDependencyAssetEventArgs playSoundDependencyAssetEventArgs = PlaySoundDependencyAssetEventArgs.Create(playSoundInfo.SerialId, soundAssetName, playSoundInfo.SoundGroup.Name, playSoundInfo.PlaySoundParams, dependencyAssetName, loadedCount, totalCount, playSoundInfo.UserData);
  660. m_PlaySoundDependencyAssetEventHandler(this, playSoundDependencyAssetEventArgs);
  661. ReferencePool.Release(playSoundDependencyAssetEventArgs);
  662. }
  663. }
  664. }
  665. }