Схаваць Red Recording Status Bar ў ІА App пры адсутнасці запісу

Я не магу атрымаць чырвоны бар «Запіс» статут, каб схаваць ў маім дадатку, калі прыкладанне працуе ў фонавым рэжыме і не запісу.

enter image description here

Я, здараецца, выкарыстоўваючы The Amazing Audio Engine , але я думаю, што гэта пытанне можна вырашыць веданне гэтай бібліятэкі. Ён атрымлівае ўстаноўку наступным чынам:

audioController = [[AEAudioController alloc] initWithAudioDescription:desc inputEnabled:YES];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

Калі карыстальнік хоча запісаць, я ўключаю мікрафон, як гэта:

[audioController addInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_PlayAndRecord;

Калі карыстальнік хоча, каб спыніць запіс, я адключыць яго:

[audioController removeInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

The problem is, when the app isn't recording & the user leaves the app, the red "Recording" status bar still shows up. I can't stop/dispose the audioController because the app may still be playing audio.

<�Моцны> Я не хачу, бар чырвоны індыкатар стану запісу, каб паказаць, калі я не запіс. Любыя ідэі, як зрабіць гэта?

абнаўленне

Я ўстаноўка наступнага блока кода для запуску кожныя 2 секунды ў маім дадатку.

audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError* error = nil;
[audioSession setActive:NO error: &error];
NSLog(@"error: %@", error);
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

Гэта часопісы:

TAAE: Setting audio session category to MediaPlayback
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput)    result 2003329396 77686174 what
Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"

Відавочна, што ён не можа адключыць мікрафон з-за чаго-то TAAE трымае на. Я не дадаў ўваходы ў кантролер, так што я не ведаю, што гэта магло быць.

14
@ Н2СО3 Не, гэтае пытанне просіць, каб схаваць радок стану пры запісе. Я не запіс.
дададзена аўтар bendytree, крыніца
@ Н2СО3 Не, гэтае пытанне просіць, каб схаваць радок стану пры запісе. Я не запіс.
дададзена аўтар bendytree, крыніца
дададзена аўтар user529758, крыніца

8 адказы

<�Моцны> рашэннямі см рэдагаваць 2

Бар ніколі не знікне да таго часу, як мікрафон знаходзіцца ў выкарыстанні, запіс ці не. гэта мера бяспекі, каб дазволіць карыстачу ведаць, што прыкладанне слухае да мікрафону, каб не паказаць, што тэлефон знаходзіцца ў рэжыме запісу.

Адзіны спосаб зрабіць гэта пайшло, каб выдаліць мікрафон з ўваходных прымачоў

Я бачу, што ваш мікрафон не выдаляецца, павінна быць нейкая памылка.

Кропка, вы не можаце схаваць Чырвоны бар, пакуль адкрыты мікрафон ..

калі вы хочаце часова адключыць яго, вы можаце паспрабаваць гэта можа быць?

[audioController setInputEnabled:NO]

Што вы спрабуеце дасягнуць у любым выпадку? што можа быць лепш звяртацца з рэчамі

<�Моцны> Змяніць 1: Паведамленні іншыя абыходныя

Я не ведаў, што setInputEnabled быў даступны толькі для чытання, прабачце.

Ну, яшчэ адна рэч, каб паспрабаваць гэта цалкам спыніць кантролер, паспрабуйце наступнае:

[audioController stop]

калі не, то паспрабаваць вызваліць яго, калі вы не выкарыстоўваеце ARC, ці проста

audioController = Nil;

Спадзяюся, што ліквідуе праблему. але я хутчэй спрабую высветліць, чаму гэта не вымаючы мікрафоны з ўваходных прымачоў .. магчыма мікрафоны гэта Nil пры выкліку [audioController removeInputReceiver: мікрафон] ??

<�Моцны> Змяніць 2: Паведамленні рашэнне

The problem arises when you initialize with inputEnabled set to YES, since it's readOnly, you can't disable the input, the only way is to actually release audioController. if you're using ARC, just set it to Nil, if not, just [audioController release]

4
дададзена
<�Код> setInputEnabled: НЕ быў мой першы інстынкт таксама, але яна не існуе на AEAudioController за выключэннем канструктара. Маё прыкладанне прайгравае гук, а таксама можа запісваць, калі карыстальнік выбірае. Калі ён ідзе ў фонавым рэжыме, і карыстальнік не запісвае, я хачу чырвоны бар, каб сысці.
дададзена аўтар bendytree, крыніца
Выдатная ідэя, і гэта спрацавала! Я быў занепакоены AudioSession, але гэта не было праблемай. Калі вы не пярэчыце, абнавіць свой адказ, і я буду адзначаць яго правільным.
дададзена аўтар bendytree, крыніца
Я палічыў за лепшае б не выпусціць кантролер, так як я, верагодна, прайграванне аўдыё. Я мяркую, што я мог бы выпусціць затым INIT новы, але гэта не з'яўляецца ідэальным. Што вар'ят я атрымліваю чырвоную паласу, нават калі я ніколі не дадаць ўваходных прыёмнік ў першую чаргу. Проста ў тым ліку inputEnabled: Так дастаткова, каб назаўсёды паказаць чырвоную паласу смерці.
дададзена аўтар bendytree, крыніца
Для мяне, толькі [audioController прыпынак] было дастаткова. Я не трэба audioController = нуль ці нешта ў гэтым родзе.
дададзена аўтар Tomer, крыніца
Гэта мае сэнс, так як вы saind, inputEnabled даступны толькі для чытання, так як адзін з спосабаў рэчы, адзіны шлях да INIT З чытання і калі вы скончыце проста адпусціце яго, не ідэальна вядома, але няма іншага шляху , тое, што я хацеў бы зрабіць гэта ініцыялізаваць два гукавых кантролераў, адзін без ўваходу і адзін з уваходам, і перамыкацца паміж імі, гэта будзе працаваць з вамі?
дададзена аўтар Mostafa Torbjørn Berg, крыніца
Добра, я бачу, я буду абнаўляць свой адказ з іншым абыходным шляхам прама цяпер
дададзена аўтар Mostafa Torbjørn Berg, крыніца
Выдатна !, Цяпер будзе рабіць :)
дададзена аўтар Mostafa Torbjørn Berg, крыніца

<�Моцны> рашэннямі см рэдагаваць 2

Бар ніколі не знікне да таго часу, як мікрафон знаходзіцца ў выкарыстанні, запіс ці не. гэта мера бяспекі, каб дазволіць карыстачу ведаць, што прыкладанне слухае да мікрафону, каб не паказаць, што тэлефон знаходзіцца ў рэжыме запісу.

Адзіны спосаб зрабіць гэта пайшло, каб выдаліць мікрафон з ўваходных прымачоў

Я бачу, што ваш мікрафон не выдаляецца, павінна быць нейкая памылка.

Кропка, вы не можаце схаваць Чырвоны бар, пакуль адкрыты мікрафон ..

калі вы хочаце часова адключыць яго, вы можаце паспрабаваць гэта можа быць?

[audioController setInputEnabled:NO]

Што вы спрабуеце дасягнуць у любым выпадку? што можа быць лепш звяртацца з рэчамі

<�Моцны> Змяніць 1: Паведамленні іншыя абыходныя

Я не ведаў, што setInputEnabled быў даступны толькі для чытання, прабачце.

Ну, яшчэ адна рэч, каб паспрабаваць гэта цалкам спыніць кантролер, паспрабуйце наступнае:

[audioController stop]

калі не, то паспрабаваць вызваліць яго, калі вы не выкарыстоўваеце ARC, ці проста

audioController = Nil;

Спадзяюся, што ліквідуе праблему. але я хутчэй спрабую высветліць, чаму гэта не вымаючы мікрафоны з ўваходных прымачоў .. магчыма мікрафоны гэта Nil пры выкліку [audioController removeInputReceiver: мікрафон] ??

<�Моцны> Змяніць 2: Паведамленні рашэнне

The problem arises when you initialize with inputEnabled set to YES, since it's readOnly, you can't disable the input, the only way is to actually release audioController. if you're using ARC, just set it to Nil, if not, just [audioController release]

4
дададзена
Выдатная ідэя, і гэта спрацавала! Я быў занепакоены AudioSession, але гэта не было праблемай. Калі вы не пярэчыце, абнавіць свой адказ, і я буду адзначаць яго правільным.
дададзена аўтар bendytree, крыніца
<�Код> setInputEnabled: НЕ быў мой першы інстынкт таксама, але яна не існуе на AEAudioController за выключэннем канструктара. Маё прыкладанне прайгравае гук, а таксама можа запісваць, калі карыстальнік выбірае. Калі ён ідзе ў фонавым рэжыме, і карыстальнік не запісвае, я хачу чырвоны бар, каб сысці.
дададзена аўтар bendytree, крыніца
Я палічыў за лепшае б не выпусціць кантролер, так як я, верагодна, прайграванне аўдыё. Я мяркую, што я мог бы выпусціць затым INIT новы, але гэта не з'яўляецца ідэальным. Што вар'ят я атрымліваю чырвоную паласу, нават калі я ніколі не дадаць ўваходных прыёмнік ў першую чаргу. Проста ў тым ліку inputEnabled: Так дастаткова, каб назаўсёды паказаць чырвоную паласу смерці.
дададзена аўтар bendytree, крыніца
Для мяне, толькі [audioController прыпынак] было дастаткова. Я не трэба audioController = нуль ці нешта ў гэтым родзе.
дададзена аўтар Tomer, крыніца
Добра, я бачу, я буду абнаўляць свой адказ з іншым абыходным шляхам прама цяпер
дададзена аўтар Mostafa Torbjørn Berg, крыніца
Гэта мае сэнс, так як вы saind, inputEnabled даступны толькі для чытання, так як адзін з спосабаў рэчы, адзіны шлях да INIT З чытання і калі вы скончыце проста адпусціце яго, не ідэальна вядома, але няма іншага шляху , тое, што я хацеў бы зрабіць гэта ініцыялізаваць два гукавых кантролераў, адзін без ўваходу і адзін з уваходам, і перамыкацца паміж імі, гэта будзе працаваць з вамі?
дададзена аўтар Mostafa Torbjørn Berg, крыніца
Выдатна !, Цяпер будзе рабіць :)
дададзена аўтар Mostafa Torbjørn Berg, крыніца

Паспрабуйце ўсталяваць аўдыё servicess ад калі вы спыняе запіс:

AudioSessionSetActive(false);
4
дададзена
дзякуй - гэта каштуе стрэл, але не працуе. Чырвоная паласа ўсё яшчэ адлюстроўваецца, калі прыкладанне працуе ў фонавым рэжыме.
дададзена аўтар bendytree, крыніца
працуе! дзякуй !!
дададзена аўтар coolbeet, крыніца

Паспрабуйце ўсталяваць аўдыё servicess ад калі вы спыняе запіс:

AudioSessionSetActive(false);
4
дададзена
дзякуй - гэта каштуе стрэл, але не працуе. Чырвоная паласа ўсё яшчэ адлюстроўваецца, калі прыкладанне працуе ў фонавым рэжыме.
дададзена аўтар bendytree, крыніца
працуе! дзякуй !!
дададзена аўтар coolbeet, крыніца

Я вырашыў гэтую праблему:

  • Having two audio controllers (as suggested in the comments): one for recording and one for playback. When the app entered background, I called [recordAudioController stop] and when I wanted to start recording again, I re-started this audio controller.
  • Removing a line of code from AEAudioController.m that tried to stop the audio session, making TAAE stop only the AUGraph:

    - (void)stopInternal {
    NSLog(@"TAAE: Stopping Engine");
    
    checkResult(AUGraphStop(_audioGraph), "AUGraphStop");
    
    if ( self.running ) {
       //Ensure top IO unit is stopped (AUGraphStop may fail to stop it)
        checkResult(AudioOutputUnitStop(_ioAudioUnit), "AudioOutputUnitStop");
    }
    
    // --- I removed the following section ---
    if ( !_interrupted ) {
        NSError *error = nil;
    
        if ( ![((AVAudioSession*)[AVAudioSession sharedInstance]) setActive:NO error:&error] ) {
            NSLog(@"TAAE: Couldn't deactivate audio session: %@", error);
        }
    }
    
    processPendingMessagesOnRealtimeThread(self);
    
    if ( _pollThread ) {
        [_pollThread cancel];
        while ( [_pollThread isExecuting] ) {
            [NSThread sleepForTimeInterval:0.01];
        }
        _pollThread = nil;
    }
    }
    
0
дададзена

Я вырашыў гэтую праблему:

  • Having two audio controllers (as suggested in the comments): one for recording and one for playback. When the app entered background, I called [recordAudioController stop] and when I wanted to start recording again, I re-started this audio controller.
  • Removing a line of code from AEAudioController.m that tried to stop the audio session, making TAAE stop only the AUGraph:

    - (void)stopInternal {
    NSLog(@"TAAE: Stopping Engine");
    
    checkResult(AUGraphStop(_audioGraph), "AUGraphStop");
    
    if ( self.running ) {
       //Ensure top IO unit is stopped (AUGraphStop may fail to stop it)
        checkResult(AudioOutputUnitStop(_ioAudioUnit), "AudioOutputUnitStop");
    }
    
    // --- I removed the following section ---
    if ( !_interrupted ) {
        NSError *error = nil;
    
        if ( ![((AVAudioSession*)[AVAudioSession sharedInstance]) setActive:NO error:&error] ) {
            NSLog(@"TAAE: Couldn't deactivate audio session: %@", error);
        }
    }
    
    processPendingMessagesOnRealtimeThread(self);
    
    if ( _pollThread ) {
        [_pollThread cancel];
        while ( [_pollThread isExecuting] ) {
            [NSThread sleepForTimeInterval:0.01];
        }
        _pollThread = nil;
    }
    }
    
0
дададзена

Я ведаю, што гэтае пытанне было трохі старым, але ў выпадку, калі іншыя людзі сустракаліся з той жа праблемай, як і я, я даў канчатковае рашэнне. Праблема здарылася ў такой сітуацыі запісу:

  1. пачаць запіс

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

  1. спыніць запіс

[session setCategory:AVAudioSessionCategoryPlayback error:&error];

калі я каментую код скіду катэгорыі сеансу прайгравання, праблема знікла. Я таксама змяніць код запісы запуску на:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];

так што голас гуляў ад прымача да прамоўцу.

0
дададзена

Я ведаю, што гэтае пытанне было трохі старым, але ў выпадку, калі іншыя людзі сустракаліся з той жа праблемай, як і я, я даў канчатковае рашэнне. Праблема здарылася ў такой сітуацыі запісу:

  1. пачаць запіс

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

  1. спыніць запіс

[session setCategory:AVAudioSessionCategoryPlayback error:&error];

калі я каментую код скіду катэгорыі сеансу прайгравання, праблема знікла. Я таксама змяніць код запісы запуску на:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];

так што голас гуляў ад прымача да прамоўцу.

0
дададзена