Skip to content

Implementation recommendation regarding error handling #131

@BLeeEZ

Description

@BLeeEZ

Hi,
I have a question regarding error handling/reaction.
I received a couple of crash reports. It seems like some AudioNodes are deinit even when they are still used.
From the attached crash log I can see in line 14 that the AudioStreamingPlayer is deinit (BackendAudioPlayer.swift:44 in Amperfy).
The only place in Amperfy where I destroy the AudioStreaming.AudioPlayer is here: https://github.com/BLeeEZ/amperfy/blob/master/AmperfyKit/Player/BackendAudioPlayer.swift#L348
The new creation is only triggered in function handleError(error: Error) which reacts to AudioPlayer errors: https://github.com/BLeeEZ/amperfy/blob/master/AmperfyKit/Player/BackendAudioPlayer.swift#L293
I wasn't able to reproduce this crash on my side. Comments in the crash report state that it occurs during "normal" playback and suddenly the App crashes.

Here are my questions:

  • Did you already encounter such a crash related to AudioNode deinits?
  • What is a safe way to destroy an AudioStreaming.AudioPlayer?
  • Is a call to detachCustomAttachedNodes() strictly require before deinit or is there a recommended sequence to safely shutdown the player?
  • What is the best way to react to any AudioPlayer error? In my case I don't want that any user notices an error. That's why I tear down the player and create a new one.

Thank you for your help in advance.

Thread 2 Crashed:
0   libobjc.A.dylib               	0x00000001950823c8 getMethodNoSuper_nolock(objc_class*, objc_selector*) + 208 (objc-runtime-new.mm:7361)
1   libobjc.A.dylib               	0x0000000195082d90 lookUpImpOrForward + 404 (objc-runtime-new.mm:7768)
2   libobjc.A.dylib               	0x000000019507f4e4 _objc_msgSend_uncached + 68
3   AudioToolboxCore              	0x00000001a47b5f28 -[AUAudioUnit deallocateRenderResources] + 52 (AUAudioUnit.mm:1079)
4   AudioToolboxCore              	0x00000001a47ba78c -[AUAudioUnit dealloc] + 44 (AUAudioUnit.mm:593)
5   AudioToolboxCore              	0x00000001a4810270 -[AUAudioUnitV2Bridge dealloc] + 56 (AUAudioUnitV2Bridge.mm:830)
6   AudioToolboxCore              	0x00000001a4812de0 -[AUHALOutputUnit dealloc] + 160 (AUAudioUnitV2Bridge.mm:1856)
7   AVFAudio                      	0x00000001cf6ae9f8 AUInterfaceBaseV3::~AUInterfaceBaseV3() + 308 (AUInterface.mm:500)
8   AVFAudio                      	0x00000001cf684184 AUInterfaceV3::~AUInterfaceV3() + 16 (AUInterface.h:338)
9   AVFAudio                      	0x00000001cf683d90 AVAudioNodeImpl::~AVAudioNodeImpl() + 108 (AVAudioNode.mm:999)
10  AVFAudio                      	0x00000001cf5c44f0 AVAudioUnitImpl::~AVAudioUnitImpl() + 16 (AVAudioUnitImpl.h:23)
11  AVFAudio                      	0x00000001cf6809a8 -[AVAudioNode dealloc] + 68 (AVAudioNode.mm:70)
12  AmperfyKit                    	0x00000001056d39fc AudioPlayer.deinit + 408
13  AmperfyKit                    	0x000000010569bd50 AudioStreamingPlayer.deinit + 4 (/<compiler-generated>:0)
14  AmperfyKit                    	0x000000010569bd50 AudioStreamingPlayer.__deallocating_deinit + 12 (BackendAudioPlayer.swift:44)
15  libswiftCore.dylib            	0x00000001951dfe60 _swift_release_dealloc + 56 (HeapObject.cpp:778)
16  libswiftCore.dylib            	0x00000001951e0c04 bool swift::RefCounts<swift::SideTableRefCountBits>::doDecrementSlow<(swift::PerformDeinit)1>(swift::SideTableRefCountBits, unsigned int) + 168 (RefCount.h:1052)
17  AmperfyKit                    	0x00000001056ce480 RemoteAudioSource.processAudio(data:) + 376 (RemoteAudioSource.swift:325)
18  AmperfyKit                    	0x00000001056ce2c0 closure #1 in RemoteAudioSource.handleSuccessfulStreamEvent(response:) + 580 (RemoteAudioSource.swift:302)
19  AmperfyKit                    	0x000000010560d428 <deduplicated_symbol> + 28
20  Foundation                    	0x000000019575c354 <deduplicated_symbol> + 24
21  Foundation                    	0x000000019575bf44 -[NSBlockOperation main] + 96 (NSOperation.m:1565)
22  Foundation                    	0x000000019575c074 __NSOPERATION_IS_INVOKING_MAIN__ + 16 (NSOperation.m:2199)
23  Foundation                    	0x000000019575bb14 -[NSOperation start] + 640 (NSOperation.m:1407)
24  Foundation                    	0x000000019575bedc __NSOPERATIONQUEUE_IS_STARTING_AN_OPERATION__ + 16 (NSOperation.m:2230)
25  Foundation                    	0x000000019575b798 __NSOQSchedule_f + 164 (NSOperation.m:2241)
26  libdispatch.dylib             	0x00000001d053c450 _dispatch_block_async_invoke2 + 148 (queue.c:598)
27  libdispatch.dylib             	0x00000001d05467ec _dispatch_client_callout + 16 (client_callout.mm:85)
28  libdispatch.dylib             	0x00000001d0535468 _dispatch_lane_serial_drain + 740 (queue.c:3991)
29  libdispatch.dylib             	0x00000001d0535f44 _dispatch_lane_invoke + 388 (queue.c:4082)
30  libdispatch.dylib             	0x00000001d05403ec _dispatch_root_queue_drain_deferred_wlh + 292 (queue.c:7265)
31  libdispatch.dylib             	0x00000001d053fce4 _dispatch_workloop_worker_thread + 692 (queue.c:6859)
32  libsystem_pthread.dylib       	0x00000001f41363b8 _pthread_wqthread + 292 (pthread.c:2696)
33  libsystem_pthread.dylib       	0x00000001f41358c0 start_wqthread + 8

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions