2

私が開発したiOSアプリを、デバイス上のXCodeからビルドして実行すると、正常に動作するという奇妙な問題があります。ただし、デバイスを再起動してアプリを実行すると、音声がまったく聞こえません。その後、アプリを強制終了してデバイスから再起動すると、オーディオの取得が再開されます。最初は割り込みハンドラの問題だと思っていましたが、もうわかりません。どんな助けでもいただければ幸いです!

念のため、これが私の割り込みハンドラです。

static void MyInterruptionListener (void *inUserData,
                                UInt32 inInterruptionState) {

printf ("Interrupted! inInterruptionState=%ld\n", inInterruptionState);
pediViewController *pediController = (__bridge pediViewController*)inUserData;
switch (inInterruptionState) {
    case kAudioSessionBeginInterruption:
        CheckError (AudioOutputUnitStop (pediController.effectState.rioUnit),
                    "Couldn't start RIO unit");
    case kAudioSessionEndInterruption:
        // TODO: doesn't work!
        CheckError(AudioSessionSetActive(true),
                   "Couldn't set audio session active");
        CheckError (AudioOutputUnitStart (pediController.effectState.rioUnit),
                    "Couldn't start RIO unit");
        break;
    default:
        break;
};

}

4

2 に答える 2

1

割り込みハンドラーではなく、オーディオ ルート変更コールバックを使用して、バックグラウンドに出入りするアプリを処理する必要があります。

これは、私があなた自身と同様の問題を抱えていたときに、とにかく私にとってうまくいったものです(私があなたの問題を正しく理解していれば)。

ここに例があります

AudioSessionAddPropertyListener (
                                     kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     (__bridge void*) self
                                     );

void audioRouteChangeListenerCallback (
                                       void                      *inUserData,
                                       AudioSessionPropertyID    inPropertyID,
                                       UInt32                    inPropertyValueSize,
                                       const void                *inPropertyValue
                                       ) {

    // Ensure that this callback was invoked because of an audio route change
    if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;


    AudioEngine *audioObject = (__bridge AudioEngine *) inUserData;

    // if application sound is not playing, there's nothing to do, so return.
    if (NO == audioObject.isPlaying) {

        NSLog (@"Audio route change while application audio is stopped.");
        return;

    } else {

        CFDictionaryRef routeChangeDictionary = inPropertyValue;

        CFNumberRef routeChangeReasonRef =
        CFDictionaryGetValue (
                              routeChangeDictionary,
                              CFSTR (kAudioSession_AudioRouteChangeKey_Reason)
                              );

        SInt32 routeChangeReason;

        CFNumberGetValue (
                          routeChangeReasonRef,
                          kCFNumberSInt32Type,
                          &routeChangeReason
                          );
             if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {

            NSLog (@"Audio output device was removed; stopping audio playback.");
            NSString *MixerHostAudioObjectPlaybackStateDidChangeNotification = @"MixerHostAudioObjectPlaybackStateDidChangeNotification";
            [[NSNotificationCenter defaultCenter] postNotificationName: MixerHostAudioObjectPlaybackStateDidChangeNotification object: audioObject]; 

        } else {

            NSLog (@"A route change occurred that does not require stopping application audio.");
        }
    }
}
于 2012-09-11T14:52:02.227 に答える
0

この問題は、iOS 6 にアップグレードすると解消されました。オーディオ コールバックのすべてのコード行をコメント アウトし、iPad を再起動してアプリを 3 回ずつ実行してテストすることで、集中的なデバッグを行いました。最終的に端末をiOS 6にアップデートして実行することで解決しました。そうすることで、パフォーマンスも大幅に向上しました!

于 2012-09-12T08:50:42.160 に答える