¿Cómo publica un MTAudioProcessingTap?

El file de encabezado para MTAudioProcessingTap dice que su initialization y preparación de las devoluciones de llamada se equilibrará mediante unprepare y finalizará las devoluciones de llamada. Sin embargo, en el ejemplo de Apple , estas devoluciones de llamada nunca se llaman (agregué un logging a ellos para que pudiera comprobar). El file de encabezado dice que se llamarán cuando se desasigne el object.

En el ejemplo de Apple, el Tap se pasa a un parámetro de retención en audioMixInputParameters, que se pasa a la mezcla de audio, donde ya no es de acceso público:

MTAudioProcessingTapRef audioProcessingTap; if (noErr == MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PreEffects, &audioProcessingTap)) { audioMixInputParameters.audioTapProcessor = audioProcessingTap; CFRelease(audioProcessingTap); audioMix.inputParameters = @[audioMixInputParameters]; _audioMix = audioMix; } 

Espero que AudioMix sea responsable de liberarlo en su propio método dealloc, y de que AudioMix se publique cuando se publique el PlayerItem asociado.

El ejemplo de Apple utiliza un AVPlayer que solo reproduce un elemento, por lo que tal vez no tenga que desasignar nada directamente. Pero en mi caso, estoy usando un AVQueuePlayer, así que sigo pasándole nuevos AVPlayerItems. Creo que está filtrando los toques que estoy creando para cada elemento del jugador (junto con las unidades de audio asociadas), aunque los elementos del jugador se desasignen.

¿Cuál es la forma correcta de desasignar el MTAudioProcessingTap y get su descompression y finalizar las devoluciones de llamada para disparar cuando termine con su elemento de jugador asociado?

Actualización : encontré que en realidad todavía se puede acceder a través de la mezcla de audio, pero liberarlo de esta manera no desencadena la falta de preparación y finaliza las devoluciones de llamada:

 ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor = nil; 

Tampoco esto:

 MTAudioProcessingTapRef audioProcessingTap = ((AVMutableAudioMixInputParameters *)audioMix.inputParameters[0]).audioTapProcessor; CFRelease(audioProcessingTap); 

Yo tuve el mismo problema. Para que funcione, tuve que restablecer el audioMix del elemento del audioMix , el procesador de toque ( MYAudioTapProcessor en el proyecto de ejemplo de Apple) y lanzar manualmente el MTAudioProcessingTapRef :

 MTAudioProcessingTapRef tap = ((AVMutableAudioMixInputParameters *)_audioTapProcessor.audioMix.inputParameters[0]).audioTapProcessor; _player.currentItem.audioMix = nil; _audioTapProcessor = nil; CFRelease(tap); 

Esto provoca que se invoque la finalize callback.

Editar: Parece que CFRelease no es obligatorio, ver comentarios.