iPhone позволяет другим приложениям воспроизводить аудио во время записи аудио / Shazam
Намереваясь делать в значительной степени то, что делает Shazam, в том, что касается записи звука, в то время как другое приложение воспроизводит звук.
1) Запись звука нормально, здесь нет проблем
2) Когда приложение запускается и начинает запись, музыка из другого приложения останавливается (itunes и т. Д.).
3) Я поиграл со всеми заклинаниями настроек AV Audio, но мне не повезло с продолжением / возобновлением звука.
4) Когда Shazam запускается, звук на некоторое время останавливается, а затем возобновляется. Я предполагаю, что Shazam что-то делает, чтобы перезапустить звук с помощью музыкального проигрывателя? Я искал и не мог найти, если есть способ сделать это.
Так что, если у кого-то есть правильные настройки, чтобы заставить это работать, это будет оценено.
Кроме того, Сказать, пожалуйста, прочитайте AV документы, это не ответ, я просмотрел их без везения.
Я пытался найти здесь
Пробовал оба типа настроек 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
{}
}