Предпочитаемый способ присоединения AudioEffect к глобальному миксу?

В Android, AudioEffect API, все встроенные эффекты, такие как эквалайзер, поставляются с предупреждением

" ПРИМЕЧАНИЕ: подключение эквалайзера к глобальное микширование аудиовыхода с использованием сеанса 0 устарело. "

Если это не рекомендуется, то какой API на замену? Моя цель - добавить эффект к глобальному выходному миксу ...

14
задан yano 22 February 2012 в 23:16
поделиться

2 ответа

Согласно Android , можно использовать ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION для получения ID играющего аудио сеанса:

Намерение сигнализировать к применению управления эффектом или обслуживанию, что новый аудио сеанс открыт и требует, чтобы были применены аудио эффекты.

я пытался добавить константу в декларации, но она не работала:

<receiver android:name=".receivers.AudioSessionReceiver">
        <intent-filter>
            <action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
        </intent-filter>
</receiver>

, Если Вы выясняете, как использовать константу, намерение будет содержать аудио ID сеанса, который можно использовать для применения настроек уравнителя, которые Вы хотите. (При нахождении обходного решения во всех тех годах Вы возражали бы разделять?)

0
ответ дан 1 December 2019 в 16:43
поделиться

Нет никакой альтернативы для присоединения AudioEffect к мировому производству. К anwer Droppin' Наука : Вы могли бы хотеть смотреть более чем здесь . Намерение, содержащее идентификатор сессии, получено в этом BroadcastReceiver. Помните, что это только работает при регистрации получателя в декларации. Кроме того, Вы могли зарегистрировать получатель программно как это в Вашем сервисе onCreate ():

IntentFilter()
    .apply { addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) }
    .apply { addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) }
    .run { registerReceiver(mAudioSessionReceiver, this) } `

, где mAudioSessionReceiver выглядит примерно так:

private val mAudioSessionReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent == null || context == null) {
            return
        }

        val sessionStates = arrayOf(
            AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION,
            AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION
        )
        if (sessionStates.contains(intent.action)) {
            val service = Intent(context, WaveletService::class.java)
            val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)
            service
                .apply { action = intent.action }
                .apply { putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionID) }
            context.startService(service)
        }
    }
}`

Затем можно получить намерение в onStartCommand:

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    if (intent == null)
        return START_STICKY

    val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)

    when (intent.action) {
        AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION -> {
            // create new instance of the AudioEffect using the sessionID
        }
        AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION -> {
            // Release instance of the AudioEffect connected to this sessionID 
        }
    }

    return START_REDELIVER_INTENT
}`

Наконец, не забывайте не регистрировать получатель в onDestroy ():

unregisterReceiver(mAudioSessionReceiver)`
0
ответ дан 1 December 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: