audioPlayer.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import Taro from "@tarojs/taro";
  2. // 音频播放状态类型
  3. type AudioPlayStatus = 'idle' | 'playing' | 'paused' | 'stopped' | 'error';
  4. // 封装后的音频实例类型
  5. interface AudioInstance {
  6. play: () => void;
  7. pause: () => void;
  8. stop: () => void;
  9. destroy: () => void;
  10. onStatusChange: (callback: (status: AudioPlayStatus) => void) => void;
  11. getStatus: () => AudioPlayStatus;
  12. }
  13. export function playWavAudio(url: string): AudioInstance {
  14. const audio = Taro.createInnerAudioContext();
  15. let currentStatus: AudioPlayStatus = 'idle';
  16. let statusChangeCallback: ((status: AudioPlayStatus) => void) | null = null;
  17. // 更新状态并触发回调
  18. const updateStatus = (newStatus: AudioPlayStatus) => {
  19. currentStatus = newStatus;
  20. if (statusChangeCallback) {
  21. statusChangeCallback(newStatus);
  22. }
  23. };
  24. audio.src = url;
  25. // 事件监听
  26. audio.onPlay(() => updateStatus('playing'));
  27. audio.onPause(() => updateStatus('paused'));
  28. audio.onStop(() => updateStatus('stopped'));
  29. audio.onEnded(() => updateStatus('stopped'));
  30. audio.onError(() => {
  31. updateStatus('error');
  32. audio.destroy();
  33. });
  34. return {
  35. play: () => {
  36. if (currentStatus !== 'playing') {
  37. audio.play();
  38. }
  39. },
  40. pause: () => {
  41. if (currentStatus === 'playing') {
  42. audio.pause();
  43. }
  44. },
  45. stop: () => {
  46. if (currentStatus === 'playing' || currentStatus === 'paused') {
  47. audio.stop();
  48. }
  49. },
  50. destroy: () => {
  51. audio.destroy();
  52. updateStatus('idle');
  53. },
  54. onStatusChange: (callback) => {
  55. statusChangeCallback = callback;
  56. },
  57. getStatus: () => currentStatus,
  58. };
  59. }