2012-05-11 4 views
3

Глядя на то, что делает Shazam, записывая аудио, в то время как другое приложение воспроизводит аудио.iPhone разрешает другим приложениям воспроизводить аудио во время записи звука/Shazam

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, но во всех случаях, когда мое приложение получает микрофон, оно останавливает звук из другого приложения.

Если я должен принести в жертву курицу стоять в направлении Apple, это хорошо, просто дайте мне знать, какой тип куриной :-)

ответ

1

После некоторого назад и вперед, похоже, используя MixWithOthers является ключ. Вы должны также убедиться, что звук маршрут установлен до последнего/текущего аудио маршрута ...

FYI Это с интерфейсом звуковых сообщений

Так что мы ...

/Старт Музыка с IPOD /Start наше приложение с

  • 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