Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf47bdd8 authored by Nick Moukhine's avatar Nick Moukhine
Browse files

Add system service for music recognition.

The client submits a RecognitionRequest via MusicRecognitionManager.  System server opens an audio stream based on the request and sends it to a MusicRecognitionService (which is exposed by a system app).  The result is passed back through system server to the original caller.

Test: tracked in b/169662646
Bug: 169403302
Change-Id: I4c7fd9d9d72ddd5678867fd037cab6198bff2c2d
parent 15b6144b
Loading
Loading
Loading
Loading
+54 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ package android {
    field public static final String BIND_EXTERNAL_STORAGE_SERVICE = "android.permission.BIND_EXTERNAL_STORAGE_SERVICE";
    field public static final String BIND_EXTERNAL_STORAGE_SERVICE = "android.permission.BIND_EXTERNAL_STORAGE_SERVICE";
    field public static final String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE";
    field public static final String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE";
    field public static final String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET";
    field public static final String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET";
    field public static final String BIND_MUSIC_RECOGNITION_SERVICE = "android.permission.BIND_MUSIC_RECOGNITION_SERVICE";
    field public static final String BIND_NETWORK_RECOMMENDATION_SERVICE = "android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE";
    field public static final String BIND_NETWORK_RECOMMENDATION_SERVICE = "android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE";
    field public static final String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
    field public static final String BIND_NOTIFICATION_ASSISTANT_SERVICE = "android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE";
    field public static final String BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE = "android.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE";
    field public static final String BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE = "android.permission.BIND_PHONE_ACCOUNT_SUGGESTION_SERVICE";
@@ -119,6 +120,7 @@ package android {
    field public static final String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
    field public static final String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
    field public static final String MANAGE_FACTORY_RESET_PROTECTION = "android.permission.MANAGE_FACTORY_RESET_PROTECTION";
    field public static final String MANAGE_FACTORY_RESET_PROTECTION = "android.permission.MANAGE_FACTORY_RESET_PROTECTION";
    field public static final String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
    field public static final String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
    field public static final String MANAGE_MUSIC_RECOGNITION = "android.permission.MANAGE_MUSIC_RECOGNITION";
    field public static final String MANAGE_ONE_TIME_PERMISSION_SESSIONS = "android.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS";
    field public static final String MANAGE_ONE_TIME_PERMISSION_SESSIONS = "android.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS";
    field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
    field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
    field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
    field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
@@ -4528,6 +4530,58 @@ package android.media.audiopolicy {
}
}
package android.media.musicrecognition {
  public class MusicRecognitionManager {
    method @RequiresPermission(android.Manifest.permission.MANAGE_MUSIC_RECOGNITION) public void beginStreamingSearch(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull java.util.concurrent.Executor, @NonNull android.media.musicrecognition.MusicRecognitionManager.RecognitionCallback);
    field public static final int RECOGNITION_FAILED_AUDIO_UNAVAILABLE = 7; // 0x7
    field public static final int RECOGNITION_FAILED_NOT_FOUND = 1; // 0x1
    field public static final int RECOGNITION_FAILED_NO_CONNECTIVITY = 2; // 0x2
    field public static final int RECOGNITION_FAILED_SERVICE_KILLED = 5; // 0x5
    field public static final int RECOGNITION_FAILED_SERVICE_UNAVAILABLE = 3; // 0x3
    field public static final int RECOGNITION_FAILED_TIMEOUT = 6; // 0x6
    field public static final int RECOGNITION_FAILED_UNKNOWN = -1; // 0xffffffff
  }
  public static interface MusicRecognitionManager.RecognitionCallback {
    method public void onAudioStreamClosed();
    method public void onRecognitionFailed(@NonNull android.media.musicrecognition.RecognitionRequest, int);
    method public void onRecognitionSucceeded(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
  }
  public abstract class MusicRecognitionService extends android.app.Service {
    ctor public MusicRecognitionService();
    method public abstract void onRecognize(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.media.musicrecognition.MusicRecognitionService.Callback);
  }
  public static interface MusicRecognitionService.Callback {
    method public void onRecognitionFailed(int);
    method public void onRecognitionSucceeded(@NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
  }
  public final class RecognitionRequest implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.media.AudioAttributes getAudioAttributes();
    method @NonNull public android.media.AudioFormat getAudioFormat();
    method public int getCaptureSession();
    method public int getIgnoreBeginningFrames();
    method public int getMaxAudioLengthSeconds();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.musicrecognition.RecognitionRequest> CREATOR;
  }
  public static final class RecognitionRequest.Builder {
    ctor public RecognitionRequest.Builder();
    method @NonNull public android.media.musicrecognition.RecognitionRequest build();
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioFormat(@NonNull android.media.AudioFormat);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setCaptureSession(int);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setIgnoreBeginningFrames(int);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setMaxAudioLengthSeconds(int);
  }
}
package android.media.session {
package android.media.session {
  public final class MediaSessionManager {
  public final class MediaSessionManager {
+51 −0
Original line number Original line Diff line number Diff line
@@ -2006,6 +2006,57 @@ package android.media.audiopolicy {


}
}


package android.media.musicrecognition {

  public class MusicRecognitionManager {
    field public static final int RECOGNITION_FAILED_AUDIO_UNAVAILABLE = 7; // 0x7
    field public static final int RECOGNITION_FAILED_NOT_FOUND = 1; // 0x1
    field public static final int RECOGNITION_FAILED_NO_CONNECTIVITY = 2; // 0x2
    field public static final int RECOGNITION_FAILED_SERVICE_KILLED = 5; // 0x5
    field public static final int RECOGNITION_FAILED_SERVICE_UNAVAILABLE = 3; // 0x3
    field public static final int RECOGNITION_FAILED_TIMEOUT = 6; // 0x6
    field public static final int RECOGNITION_FAILED_UNKNOWN = -1; // 0xffffffff
  }

  public static interface MusicRecognitionManager.RecognitionCallback {
    method public void onAudioStreamClosed();
    method public void onRecognitionFailed(@NonNull android.media.musicrecognition.RecognitionRequest, int);
    method public void onRecognitionSucceeded(@NonNull android.media.musicrecognition.RecognitionRequest, @NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
  }

  public abstract class MusicRecognitionService extends android.app.Service {
    ctor public MusicRecognitionService();
    method public abstract void onRecognize(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.media.musicrecognition.MusicRecognitionService.Callback);
  }

  public static interface MusicRecognitionService.Callback {
    method public void onRecognitionFailed(int);
    method public void onRecognitionSucceeded(@NonNull android.media.MediaMetadata, @Nullable android.os.Bundle);
  }

  public final class RecognitionRequest implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.media.AudioAttributes getAudioAttributes();
    method @NonNull public android.media.AudioFormat getAudioFormat();
    method public int getCaptureSession();
    method public int getIgnoreBeginningFrames();
    method public int getMaxAudioLengthSeconds();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.musicrecognition.RecognitionRequest> CREATOR;
  }

  public static final class RecognitionRequest.Builder {
    ctor public RecognitionRequest.Builder();
    method @NonNull public android.media.musicrecognition.RecognitionRequest build();
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setAudioFormat(@NonNull android.media.AudioFormat);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setCaptureSession(int);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setIgnoreBeginningFrames(int);
    method @NonNull public android.media.musicrecognition.RecognitionRequest.Builder setMaxAudioLengthSeconds(int);
  }

}

package android.media.tv {
package android.media.tv {


  public final class TvInputManager {
  public final class TvInputManager {
+13 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,8 @@ import android.media.MediaRouter;
import android.media.MediaTranscodeManager;
import android.media.MediaTranscodeManager;
import android.media.midi.IMidiManager;
import android.media.midi.IMidiManager;
import android.media.midi.MidiManager;
import android.media.midi.MidiManager;
import android.media.musicrecognition.IMusicRecognitionManager;
import android.media.musicrecognition.MusicRecognitionManager;
import android.media.projection.MediaProjectionManager;
import android.media.projection.MediaProjectionManager;
import android.media.soundtrigger.SoundTriggerManager;
import android.media.soundtrigger.SoundTriggerManager;
import android.media.tv.ITvInputManager;
import android.media.tv.ITvInputManager;
@@ -1118,6 +1120,17 @@ public final class SystemServiceRegistry {
                return new AutofillManager(ctx.getOuterContext(), service);
                return new AutofillManager(ctx.getOuterContext(), service);
            }});
            }});


        registerService(Context.MUSIC_RECOGNITION_SERVICE, MusicRecognitionManager.class,
                new CachedServiceFetcher<MusicRecognitionManager>() {
                    @Override
                    public MusicRecognitionManager createService(ContextImpl ctx) {
                        IBinder b = ServiceManager.getService(
                                Context.MUSIC_RECOGNITION_SERVICE);
                        return new MusicRecognitionManager(
                                IMusicRecognitionManager.Stub.asInterface(b));
                    }
                });

        registerService(Context.CONTENT_CAPTURE_MANAGER_SERVICE, ContentCaptureManager.class,
        registerService(Context.CONTENT_CAPTURE_MANAGER_SERVICE, ContentCaptureManager.class,
                new CachedServiceFetcher<ContentCaptureManager>() {
                new CachedServiceFetcher<ContentCaptureManager>() {
            @Override
            @Override
+8 −0
Original line number Original line Diff line number Diff line
@@ -4480,6 +4480,14 @@ public abstract class Context {
     */
     */
    public static final String SOUND_TRIGGER_MIDDLEWARE_SERVICE = "soundtrigger_middleware";
    public static final String SOUND_TRIGGER_MIDDLEWARE_SERVICE = "soundtrigger_middleware";


    /**
     * Used to access {@link MusicRecognitionManagerService}.
     *
     * @hide
     * @see #getSystemService(String)
     */
    public static final String MUSIC_RECOGNITION_SERVICE = "music_recognition";

    /**
    /**
     * Official published name of the (internal) permission service.
     * Official published name of the (internal) permission service.
     *
     *
+13 −0
Original line number Original line Diff line number Diff line
@@ -3442,6 +3442,14 @@
    <permission android:name="android.permission.BIND_CONTENT_SUGGESTIONS_SERVICE"
    <permission android:name="android.permission.BIND_CONTENT_SUGGESTIONS_SERVICE"
                android:protectionLevel="signature" />
                android:protectionLevel="signature" />


    <!-- Must be declared by a android.service.musicrecognition.MusicRecognitionService,
         to ensure that only the system can bind to it.
         @SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
         <p>Protection level: signature
    -->
    <permission android:name="android.permission.BIND_MUSIC_RECOGNITION_SERVICE"
        android:protectionLevel="signature" />

    <!-- Must be required by a android.service.autofill.augmented.AugmentedAutofillService,
    <!-- Must be required by a android.service.autofill.augmented.AugmentedAutofillService,
         to ensure that only the system can bind to it.
         to ensure that only the system can bind to it.
         @SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
         @SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
@@ -4799,6 +4807,11 @@
    <permission android:name="android.permission.MANAGE_CONTENT_CAPTURE"
    <permission android:name="android.permission.MANAGE_CONTENT_CAPTURE"
        android:protectionLevel="signature" />
        android:protectionLevel="signature" />


    <!-- @SystemApi Allows an application to manage the music recognition service.
         @hide  <p>Not for use by third-party applications.</p> -->
    <permission android:name="android.permission.MANAGE_MUSIC_RECOGNITION"
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to manage the content suggestions service.
    <!-- @SystemApi Allows an application to manage the content suggestions service.
         @hide  <p>Not for use by third-party applications.</p> -->
         @hide  <p>Not for use by third-party applications.</p> -->
    <permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
    <permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
Loading