3

これは、iOS アプリのサウンドで発生している奇妙な問題です。

私のコードは約 90% の確率で動作するため、バグを再現するのはそれほど簡単ではありません。

しかし、問題は録音の最後に (たまに) 発生するようです。記録を手動で停止したとき、または自動的に停止したときのいずれかです。

デバッガーの下で、イヤホンのプラグイン/プラグアウトに関連するプログラムのある時点でクラッシュが表示されます。実際にはイヤホンが差し込まれておらず、私はイヤホンを差し込んだり抜いたりしていません。

プログラムのある時点でこのコードがあります。

AudioSessionPropertyID routeChangeID=kAudioSessionProperty_AudioRouteChange;
AudioSessionAddPropertyListener(routeChangeID,svcHandleRouteChange,(__bridge void *)(self));

この:

void svcHandleRouteChange(void *inUserData,AudioSessionPropertyID inPropertyID,
                          UInt32 inPropertyValueSize,const void *inPropertyValue)
{
    CFStringRef route;
    UInt32 propertySize=sizeof(CFStringRef);
    if (AudioSessionGetProperty(kAudioSessionProperty_AudioRoute,&propertySize,&route)==0)  {
        NSString *routeString = (__bridge NSString *) route;
        if ([routeString isEqualToString: @"Headphone"]) {
            // A headphone is now plugged in.
            // We do nothing.
        } else if ([routeString isEqualToString: @"Speaker"]) {
            // No headphone is plugged in. The device is using the speaker.
            LocalViewController* this=(__bridge LocalViewController*)inUserData;

            //[this->audioPlayer pause]; // The private variable audioPlayer could be accessed like this.
            [this headPhoneOut];
        } else {
            // This should not happen!!
        }
    }
}

クラッシュは次の行で発生しています: LocalViewController* this=(__bridge LocalViewController*)inUserData;

そして最後に、誰かが私にヒントを与えるのに役立つ場合に備えて、クラッシュ後にデバッガーで取得したバックトレースを次に示します。

(lldb) bt
* thread #5: tid = 0x292d8, 0x3abba0ec libobjc.A.dylib`objc_retain + 12, stop reason = EXC_BAD_ACCESS (code=1, address=0x6e966a29)
    frame #0: 0x3abba0ec libobjc.A.dylib`objc_retain + 12
    frame #1: 0x000eb7d6 parl100`svcHandleRouteChange(inUserData=0x14e5f190, inPropertyID=1919902568, inPropertyValueSize=4, inPropertyValue=0x14f0b120) + 182 at LocalViewController.m:801
    frame #2: 0x301ae944 AudioToolbox`AudioSessionPropertyListeners::CallPropertyListenersImp(unsigned long, unsigned long, void const*) + 684
    frame #3: 0x301ae456 AudioToolbox`AudioSessionPropertyListeners::CallPropertyListeners(unsigned long, unsigned long, void const*) + 334
    frame #4: 0x301aee90 AudioToolbox`HandleCFPropertyListChange(unsigned int, unsigned long, unsigned char*, unsigned int) + 412
    frame #5: 0x301aec7e AudioToolbox`HandleAudioSessionPropertyChangedBlobListenerMessage(unsigned int, void*, unsigned int) + 206
    frame #6: 0x301aeb0e AudioToolbox`ASCallbackReceiver_AudioSessionPropertyChangedBlobListenerMessage + 178
    frame #7: 0x301aea3e AudioToolbox`_XAudioSessionPropertyChangedBlobListenerMessage + 94
    frame #8: 0x301ae088 AudioToolbox`mshMIGPerform + 124
    frame #9: 0x308dc9e6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34
    frame #10: 0x308dc982 CoreFoundation`__CFRunLoopDoSource1 + 346
    frame #11: 0x308db156 CoreFoundation`__CFRunLoopRun + 1398
    frame #12: 0x30845ce6 CoreFoundation`CFRunLoopRunSpecific + 522
    frame #13: 0x30845aca CoreFoundation`CFRunLoopRunInMode + 106
    frame #14: 0x2f837588 libAVFAudio.dylib`GenericRunLoopThread::Entry(void*) + 128
    frame #15: 0x2f82ba96 libAVFAudio.dylib`CAPThread::Entry(CAPThread*) + 178
    frame #16: 0x3b1e4c1c libsystem_pthread.dylib`_pthread_body + 140
    frame #17: 0x3b1e4b8e libsystem_pthread.dylib`_pthread_start + 102
(lldb) 

アプリの別の場所で同じ問題が発生する 2 番目のケースを次に示します。

2013-10-23 12:25:12.135 parl100[1532:60b] audioRecorderDidFinishRecording
(lldb) bt
* thread #5: tid = 0x2b37a, 0x3abba0ec libobjc.A.dylib`objc_retain + 12, stop reason = EXC_BAD_ACCESS (code=1, address=0xd0003511)
    frame #0: 0x3abba0ec libobjc.A.dylib`objc_retain + 12
    frame #1: 0x000f18a2 parl100`cvcHandleRouteChange(inUserData=0x176b5610, inPropertyID=1919902568, inPropertyValueSize=4, inPropertyValue=0x1762d660) + 182 at ZapViewController.m:566
    frame #2: 0x301ae944 AudioToolbox`AudioSessionPropertyListeners::CallPropertyListenersImp(unsigned long, unsigned long, void const*) + 684
    frame #3: 0x301ae456 AudioToolbox`AudioSessionPropertyListeners::CallPropertyListeners(unsigned long, unsigned long, void const*) + 334
    frame #4: 0x301aee90 AudioToolbox`HandleCFPropertyListChange(unsigned int, unsigned long, unsigned char*, unsigned int) + 412
    frame #5: 0x301aec7e AudioToolbox`HandleAudioSessionPropertyChangedBlobListenerMessage(unsigned int, void*, unsigned int) + 206
    frame #6: 0x301aeb0e AudioToolbox`ASCallbackReceiver_AudioSessionPropertyChangedBlobListenerMessage + 178
    frame #7: 0x301aea3e AudioToolbox`_XAudioSessionPropertyChangedBlobListenerMessage + 94
    frame #8: 0x301ae088 AudioToolbox`mshMIGPerform + 124
    frame #9: 0x308dc9e6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34
    frame #10: 0x308dc982 CoreFoundation`__CFRunLoopDoSource1 + 346
    frame #11: 0x308db156 CoreFoundation`__CFRunLoopRun + 1398
    frame #12: 0x30845ce6 CoreFoundation`CFRunLoopRunSpecific + 522
    frame #13: 0x30845aca CoreFoundation`CFRunLoopRunInMode + 106
    frame #14: 0x2f837588 libAVFAudio.dylib`GenericRunLoopThread::Entry(void*) + 128
    frame #15: 0x2f82ba96 libAVFAudio.dylib`CAPThread::Entry(CAPThread*) + 178
    frame #16: 0x3b1e4c1c libsystem_pthread.dylib`_pthread_body + 140
    frame #17: 0x3b1e4b8e libsystem_pthread.dylib`_pthread_start + 102
(lldb) 

必要に応じて、さらにコードを提供できます。何を含めるべきか教えてください。

誰かが私が適切な方法で行ってはならないことを指摘してくれることを願っています.

4

0 に答える 0