فهرست منبع

针对耳机端口连接后 暂停播放

onecold 8 ماه پیش
والد
کامیت
e0a0b33b90

+ 12 - 11
entry/src/main/ets/view/LocalMusic.ets

@@ -49,7 +49,7 @@ import { repairAudioMetadata, convertDsfToWav, getApiLyric,changeMusicCover} fro
 import { extractHwMediaMetadata, FFMpegTags,Utility } from '../common/util/Utility';
 import { TagsContentCover } from '../view/TagsContentCover';
 import {
-  // DeviceChangeReason,
+  DeviceChangeReason,
   IjkMediaPlayer,
   InterruptEvent,
   InterruptHintType,
@@ -1181,16 +1181,17 @@ export struct LocalMusic {
     }
     this.mIjkMediaPlayer.on('audioInterrupt', event);
     // 音频设备断连回调处理
-    // let deviceChangeEvent: Callback<InterruptEvent> = (event) => {
-    //   LogUtils.getInstance().LOGI(`Heanup deviceChange event: ${JSON.stringify(event)}`);
-    //   if (event.reason === DeviceChangeReason.REASON_NEW_DEVICE_AVAILABLE) { // 音频设备连接
-    //
-    //   } else if (event.reason === DeviceChangeReason.REASON_OLD_DEVICE_UNAVAILABLE) { // 音频设备断开连接
-    //     this.pause();
-    //   }
-    // }
-    // // 订阅音频设备断开和连接事件
-    // this.mIjkMediaPlayer.on('deviceChange', deviceChangeEvent);
+    let deviceChangeEvent: Callback<InterruptEvent> = (event) => {
+      LogUtils.getInstance().LOGI(`Heanup deviceChange event: ${JSON.stringify(event)}`);
+      if (event.reason === DeviceChangeReason.REASON_NEW_DEVICE_AVAILABLE) { // 音频设备连接
+
+      } else if (event.reason === DeviceChangeReason.REASON_OLD_DEVICE_UNAVAILABLE) { // 音频设备断开连接
+        console.info('onecold 音频设备断开连接, 暂停播放')
+        this.pause();
+      }
+    }
+    // 订阅音频设备断开和连接事件
+    this.mIjkMediaPlayer.on('deviceChange', deviceChangeEvent);
 
     const eventPause: emitter.InnerEvent = { eventId: EventConstants.EVENT_PLAY_PAUSE }
     // 监听广播事件(hicar断开暂停播放)

+ 2 - 0
ijkplayer/index.ets

@@ -17,6 +17,8 @@ export { IjkMediaPlayer } from "./src/main/ets/ijkplayer/IjkMediaPlayer";
 
 export { InterruptEvent } from "./src/main/ets/ijkplayer/IjkMediaPlayer";
 
+export { DeviceChangeReason } from "./src/main/ets/ijkplayer/IjkMediaPlayer";
+
 export { InterruptHintType } from "./src/main/ets/ijkplayer/IjkMediaPlayer";
 
 export { InterruptForceType } from "./src/main/ets/ijkplayer/IjkMediaPlayer";

+ 41 - 10
ijkplayer/src/main/ets/ijkplayer/IjkMediaPlayer.ets

@@ -29,6 +29,7 @@ import { BusinessError, Callback } from '@ohos.base';
 import { newIjkPlayerAudio } from 'libijkplayer_audio_napi.so';
 
 export type AudioInterrupt = 'audioInterrupt';
+export type AudioDeviceChange = 'deviceChange';
 
 export enum InterruptHintType {
   INTERRUPT_HINT_NONE = 0,
@@ -45,10 +46,23 @@ export enum InterruptForceType {
 }
 
 export interface InterruptEvent {
-  forceType: InterruptForceType;
-  hintType: InterruptHintType;
+  forceType?: InterruptForceType;
+  hintType?: InterruptHintType;
+  reason?: DeviceChangeReason;
 }
 
+export enum DeviceChangeReason {
+  /* Unknown. */
+  REASON_UNKNOWN = 0,
+  /* New Device available. */
+  REASON_NEW_DEVICE_AVAILABLE = 1,
+  /* Old Device unavailable. Applications should consider to pause the audio playback when this reason is
+  reported. */
+  REASON_OLD_DEVICE_UNAVAILABLE = 2,
+  /* Device is overrode by user or system. */
+  REASON_OVERRODE = 3,
+};
+
 export class IjkMediaPlayer {
   private static instance: IjkMediaPlayer;
   public static OPT_CATEGORY_FORMAT: string = "1";
@@ -70,8 +84,9 @@ export class IjkMediaPlayer {
   private ijkplayer_napi: IjkPlayerNapi | null = null;
   private ijkplayer_audio_napi: newIjkPlayerAudio | null = null;
   private id: string = '';
-  private callback: Callback<InterruptEvent> | null = null;
-
+  // private callback: Callback<InterruptEvent> | null = null;
+  private interruptCallback: Callback<InterruptEvent> | null = null;
+  private deviceChangeCallback: Callback<InterruptEvent> | null = null;
   public constructor(id?: string) {
     if (id) {
       this.id = id;
@@ -236,12 +251,20 @@ export class IjkMediaPlayer {
     }
   }
 
-  public on(type: AudioInterrupt,  callback: Callback<InterruptEvent>) : void {
-    this.callback= callback;
+  public on(type: AudioInterrupt|AudioDeviceChange,  callback: Callback<InterruptEvent>) : void {
+    if(type == 'audioInterrupt') {
+      this.interruptCallback= callback;
+    } else if(type == "deviceChange") {
+      this.deviceChangeCallback = callback
+    }
   }
 
-  public off(type: AudioInterrupt): void {
-    this.callback = null;
+  public off(type: AudioInterrupt|AudioDeviceChange): void {
+    if(type == 'audioInterrupt') {
+      this.interruptCallback= null;
+    } else if(type == "deviceChange") {
+      this.deviceChangeCallback = null
+    }
   }
 
   setOnVideoSizeChangedListener(listener: OnVideoSizeChangedListener): void {
@@ -347,12 +370,20 @@ export class IjkMediaPlayer {
         onTimedTextListener.onTimedText(obj);
       }
       if (what == MessageType.MEDIA_AUDIO_INTERRUPT && onCompletionListener != null) {
-        if (this.callback){
+        if (this.interruptCallback){
           let event: InterruptEvent = {
             forceType: arg1,
             hintType: arg2,
           }
-          this.callback(event);
+          this.interruptCallback(event);
+        }
+      }
+      if (what == MessageType.MEDIA_AUDIO_DEVICE_CHANGE && onCompletionListener != null) {
+        if (this.deviceChangeCallback){
+          let event: InterruptEvent = {
+            reason: arg1,
+          }
+          this.deviceChangeCallback(event);
         }
       }
     };

+ 2 - 0
ijkplayer/src/main/ets/ijkplayer/common/MessageType.ets

@@ -33,6 +33,8 @@ export class MessageType {
 
   static MEDIA_AUDIO_INTERRUPT:number = 201;
 
+  static MEDIA_AUDIO_DEVICE_CHANGE:number = 202;
+
   static MEDIA_SET_VIDEO_SAR:number = 10001;
 
 }