Proceso de adquisición de AudioTrack para modificar el StreamType de la aplicación especificada

Para diferenciar específicamente los escenarios de aplicación del dispositivo Android para automóvil del dispositivo terminal móvil, algunas transmisiones de audio especiales deben convertirse a la fuerza en la capa del marco del sistema. En respuesta a esta demanda, podemos forzar cambios en la producción de la transmisión de datos de audio. .

Primero observe el
código fuente system / media / audio / include / system / audio-base.h de cuántos tipos de Audio StreamType están definidos por el sistema

typedef enum {
    
    
    AUDIO_STREAM_DEFAULT = -1, // (-1)
    AUDIO_STREAM_MIN = 0,
    AUDIO_STREAM_VOICE_CALL = 0,
    AUDIO_STREAM_SYSTEM = 1,
    AUDIO_STREAM_RING = 2,
    AUDIO_STREAM_MUSIC = 3,
    AUDIO_STREAM_ALARM = 4,
    AUDIO_STREAM_NOTIFICATION = 5,
    AUDIO_STREAM_BLUETOOTH_SCO = 6,
    AUDIO_STREAM_ENFORCED_AUDIBLE = 7,
    AUDIO_STREAM_DTMF = 8,
    AUDIO_STREAM_TTS = 9,
    AUDIO_STREAM_ACCESSIBILITY = 10,
    AUDIO_STREAM_REROUTING = 11,
    AUDIO_STREAM_PATCH = 12,
    AUDIO_STREAM_PUBLIC_CNT = 11, // (ACCESSIBILITY + 1)
    AUDIO_STREAM_FOR_POLICY_CNT = 12, // PATCH
    AUDIO_STREAM_CNT = 13, // (PATCH + 1)
} audio_stream_type_t;

Tomemos la aplicación de navegación como ejemplo. El nivel de flujo de datos de la escena de la aplicación de navegación en el automóvil es más alto que la reproducción de medios ordinarios, por lo que forzamos el tipo de música establecido por la configuración predeterminada de la aplicación de navegación para que sea un flujo de alarma, de modo que prepárese para la implementación posterior de la estrategia de audio para automóviles.

AudioTrack, el productor de datos de audio, puede ayudarnos. Simplemente describa la idea y cargue directamente el código, y obtenga directamente el proceso de la aplicación de navegación correspondiente. El proceso actual está activo (la navegación está en el momento de la transmisión de voz de tts), y se modifica a la fuerza a AUDIO_STREAM_ALARM.

frameworks \ av \ media \ libaudioclient \ AudioTrack.cpp
aumentar la adquisición de funciones

static int get_pack_from_cmdline(int pid, char *buf, int len) {
    
    
   char filename[256];
   int n = 0;
   int fd;
   if (pid < 1 || buf == NULL || len < 256) {
    
    
       return -1;
   }
   memset(filename, 0, 256);
   sprintf(filename, "/proc/%d/cmdline", pid);
   fd = open(filename, O_RDONLY);
   if (fd < 0) {
    
    
       perror("open:");
       return -1;
   }
   int ret = read(fd, buf, len);
   close(fd);
   memset(filename, 0, 256);
   while (1) {
    
    
       if (buf[n] == ' '||buf[n] == ':')
           break;
       filename[n] = buf[n];
       n++;
       if (n == ret)
           break;
   }
   memset(buf, 0, len);
   memcpy(buf, filename, n + 1);
   return ret;
}

AudioTrack establece inicialmente la función establecida del parámetro de reproducción para implementar el cambio de tipo de transmisión

  status_t AudioTrack::set(
        audio_stream_type_t streamType,
        uint32_t sampleRate,
        audio_format_t format,
        audio_channel_mask_t channelMask,
        size_t frameCount,
        audio_output_flags_t flags,
        callback_t cbf,
        void* user,
        int32_t notificationFrames,
        const sp<IMemory>& sharedBuffer,
        bool threadCanCallJava,
        audio_session_t sessionId,
        transfer_type transferType,
        const audio_offload_info_t *offloadInfo,
        uid_t uid,
        pid_t pid,
        const audio_attributes_t* pAttributes,
        bool doNotReconnect,
        float maxRequiredSpeed)
{
    
    
    MTK_ALOGI("set(): %p, streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
          "flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
          this, streamType, sampleRate, format, channelMask, frameCount, flags,
          notificationFrames, sessionId, transferType, uid, pid);
    ALOGV("set(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
          "flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
          streamType, sampleRate, format, channelMask, frameCount, flags, notificationFrames,
          sessionId, transferType, uid, pid);
...
...

   //获取进程
	char pidName[256];
	memset(pidName, 0, 256);
	get_pack_from_cmdline(getpid(), pidName, 256);
	if (strcmp(pidName,"具体的导航app进程名,eg.高德com.autonavi.amapauto")== 0){
    
    
		mSteamType = AUDIO_STREAM_ALARM ;
	}

De esta manera, el flujo de datos de audio de navegación se puede distinguir del flujo de datos de reproducción multimedia, para realizar la estrategia de audio en el automóvil.

Supongo que te gusta

Origin blog.csdn.net/jeephao/article/details/107302285
Recomendado
Clasificación