iPhone позволяет другим приложениям воспроизводить аудио во время записи аудио / Shazam

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

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

1 ответ

Решение

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

К вашему сведению это с интерфейсом AudioQueue

Итак, мы...

/ Запустите музыку с iPod / Запустите наше приложение с

  • AudioQueueNewInput
  • AudioQueueAddPropertyListener
  • AudioQueueAllocateBuffer (ы)
  • AudioQueueEnqueueBuffer (ы)
  • 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
        {}
}
Другие вопросы по тегам