2012-05-11 15 views
3

他のアプリがオーディオを再生している間、Shazamがオーディオを録音するまではほとんど行っていません。iPhoneオーディオ/シャザムを録音中に他のアプリケーションでオーディオを再生できるようにする

1)録音オーディオ罰金、ここでアプリが起動し、記録を開始が、他のアプリから音楽が停止し

2)(iTunesの問題はない、など)。

3)オーディオを継続/再開させてもらえず、AV Audio設定のすべての呪文を使ってプレイしました。

4)Shazamが起動すると、音声が少し停止してから再開します。私はShazamが音楽プレーヤーでオーディオを再開するために何かをやっていると思いますか?私は検索し、これを行う方法があるかどうかを見つけることができませんでした。

誰かがこれを正しく動作させるための適切な設定をしていれば、それは感謝します。

また、AVドキュメントを読んでください、答えではありません、私は運がないこれらを見てきました。ここ

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategories/AudioSessionCategories.html

見つけ、私が試してみました

は設定の両方のAVとKタイプを試してみました。どのように正確にMICが動作する限り、設定の違いが表示されますが、私のアプリがマイクを取得するすべてのケースで、それは他のアプリからオーディオを停止します。

私はアップルの方向に鶏の地位を犠牲にしなければならない場合、これは結構です、ちょうど私はいくつかのバック後前後に鶏の種類:-)

答えて

1

を知らせ、それはMixWithOthersを使用してのように見えていますキー。また、音声ルートが最後/現在のオーディオのルートに設定されていることを確認する必要があります...

FYIこれには、AudioQueueインタフェース

で私たちです...

のiPod と

/スタート音楽/

  • で我々のアプリを起動しAudioQueueNewInput
  • AudioQueueAddPropertyListener
  • AudioQueueAllocateBuffer(S)
  • AudioQueueEnqueueBuffer(S)
  • setupCat
  • setupDuck
  • setupAudioRoute
  • setupMixing
  • AudioSessionSetActive(真)
  • AudioQueueStart

typedef union 
{ 
    OSStatus propertyResult; 
    char a[4]; 
} unionstatus; 

unionstatus u2; 

typedef union 
{ 
    UInt32 UI32sessionCat; 
    char a[4]; 
} unionuint32; 

unionuint32 usc2; 

bool setAudioUInt32 (UInt32 property, UInt32 value) 
{ 
    bool result = true; 

    UInt32 UI32 = value; 
    UInt32 UI32size = sizeof(UI32); 

    u2.propertyResult = AudioSessionSetProperty (property, UI32size , &UI32); 

    if (u2.propertyResult) 
    { 
     printf("Error Set %ld %lx %c%c%c%c\n",u2.propertyResult,u2.propertyResult,u2.a[3],u2.a[2],u2.a[1],u2.a[0]); 
     result = false; 
    } 
    return result; 
} 

UInt32 getAudioSettingInt (UInt32 value) 
{ 
    UInt32 I32; 
    UInt32 I32size = sizeof(I32); 

    u2.propertyResult = AudioSessionGetProperty (value , &I32size, &I32); 

    if (u2.propertyResult) 
     printf("Error Get %ld %lx %c%c%c%c\n",u2.propertyResult,u2.propertyResult,u2.a[3],u2.a[2],u2.a[1],u2.a[0]); 

    return (I32); 
} 

/// checking taken out 

bool otherPlaying = getAudioSettingInt (kAudioSessionProperty_OtherAudioIsPlaying); 
if (otherPlaying) 
{ 
    setAudioUInt32 (kAudioSessionProperty_OtherMixableAudioShouldDuck, false); 
    // this returns a string, arg, have to look for string values, etc. 
    UInt32 audioRoute = getAudioSettingInt (kAudioSessionProperty_AudioRoute); 

    CFStringRef ar = (CFStringRef) audioRoute; 
    CFStringEncoding encodingMethod = CFStringGetSystemEncoding(); 
    const char *car = CFStringGetCStringPtr(ar,encodingMethod); 
    CFRange range = CFStringFind(ar,CFSTR("Headphones"),kCFCompareCaseInsensitive); 

    if (range.length == 0) // we have speakers 
     result = setAudioUInt32 (kAudioSessionProperty_OverrideAudioRoute, kAudioSessionOverrideAudioRoute_Speaker); 
    else // we have headphones 
     {} 
} 
+0

あなたもオーディオルートが最後に設定されていることを確認する必要があります/現在のオーディオルート...最後に/現在のルートを取得しますか? – loretoparisi

関連する問題