4

別のアプリがオーディオを再生している間にオーディオを録音する限り、Shazamが行っていることのほとんどを実行しようとしています。

1)オーディオを正常に録音します。ここでは問題ありません。

2)アプリが起動して録音を開始すると、別のアプリからの音楽が停止します(iTunesなど)。

3)AVオーディオ設定のすべての呪文を試してみましたが、オーディオを続行/再開することができませんでした。

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

したがって、これを機能させるための適切な設定を誰かが持っている場合は、それをいただければ幸いです。

また、「AVドキュメントを読んでください」と言っても、答えではありません。運が悪かったので、これらを調べました。

ここで見つけてみました

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

AVタイプとKタイプの両方の設定を試しました。MICがどの程度正確に機能するかについては設定に違いがありますが、すべての場合で、アプリがマイクを取得すると、他のアプリからの音声が停止します。

Appleの方向に立っている鶏を犠牲にしなければならない場合、これは問題ありません。鶏の種類を教えてください:-)

4

1 に答える 1

1

何度か行ったり来たりした後、MixWithOthers を使用することが鍵のようです。また、音声ルートが最後/現在の音声ルートに設定されていることを確認する必要があります...

参考までに、これは AudioQueue インターフェイスを使用しています

だから私たちは...

/ iPod で音楽を開始 / でアプリを開始

  • AudioQueueNewInput
  • AudioQueueAddPropertyListener
  • AudioQueueAllocateBuffer(s)
  • AudioQueueEnqueueBuffer(s)
  • セットアップキャット
  • setupダック
  • setupAudioRoute
  • setupミキシング
  • 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
        {}
}
于 2012-06-04T19:12:44.060 に答える