AudioSessionSetActive uzilishdan keyin bajarilmaydi

Men haftalarcha nimalar sodir bo'lishini tushunishga harakat qilardim va nima uchun to'xtab qolgandan keyin oynatishni davom ettira olmasligim haqida hech qanday tasavvurga ega emasman. AudioSessionSetActive (TRUE) har doim "myat" funksiyasini qaytaradi, ya'ni kAudioSessionIncompatibleCategory bo'lsa, mening ilovam fonda o'ynasa va boshqa ilovada bo'lsam. Mening ilovamda to'xtab qolsam, u yaxshi ishlaydi va ijro etilishini davom ettiradi.

Asl kod aslida barcha AudioSession va AudioQueue chaqiruvlariga ega, agar u xato bo'lsa, OSStatus-ni bosib chiqaradigan makrolarga o'ralgan, ammo men uni yanada yaxshiroq o'qish uchun olib tashladim. Bundan tashqari, [o'z-o'zidan to'xtatib] faqat pauzani yoqadi, shuning uchun asosan AudioQueueStart (audioQueue, NULL) chaqiradi, ammo AudioSession ishlamay qolsa, u ishlamaydi.

Audio-sessiyani ishga tushirish kodi:

AudioSessionInitialize(NULL, NULL, _audioSessionInterruptionListener, self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, _audioSessionPropertyListener, self);
AudioSessionSetActive(TRUE);

Ishni to'xtatish kodi:

- (void)handleInterruptionChangeToState:(AudioQueuePropertyID)inInterruptionState 
{
    if(inInterruptionState == kAudioSessionBeginInterruption)
    {

        NSLog(@"+Interruption"); 

        if(self.state == NX_STATE_PLAY) 
        {
            [self pause];
            AudioSessionSetActive(FALSE);

            isPausedByInterruption = YES;
        }
    }
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    {
        if(isPausedByInterruption) 
        {
            AudioSessionSetActive(TRUE);
            [self pause];

            isPausedByInterruption = FALSE;
        }

        NSLog(@"-Interruption");
    }
}

Ushbu streamer manba kodini bu yerdan topishingiz mumkin https://bitbucket .org/va/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Sinflar/NxAudioStreamer.m agar biror masalani echishda yordam beradigan bo'lsa.

8

6 javoblar

Agar AudioQueue API-dan foydalanayotgan bo'lsangiz, ba'zi bir omillarga bog'liq qo'shimcha qadamlar qo'yish kerak. Men buni hech qachon qilmaganman, shuning uchun men tushuntirishni ekspertga qoldiraman:
Bu muammoni qoplaydigan Apple Tuzuvchi veb-saytida ushbu mavzu bo'yicha video bor. WWDC 2010 sessiyasi 412 iPhone OS uchun 1-qism ovozini rivojlantirish 45-daqiqada atrofingizdagi juda yaxshi tushuntirishingiz bor.

3
qo'shib qo'ydi
Bu videoda juda ko'p narsa bor, agar to'g'ri esimda, AudioSession kategoriyasida bo'lim mavjud bo'lsa, ehtimol o'sha erda biror narsa topasiz.
qo'shib qo'ydi muallif Vincent Bernier, manba
Nima uchun AudioSessionSetActive (rost) ni qabul qila olmayapman; mushuk, ehtimol, nima qaytib kelishi muhim emas, faqat ijro etishni davom ettirishim kerak. Ya'ni, asosan, apparat kodekini ishlatayotganda, AudioQueue-ni chiqarib tashlashim kerak. Bu juda muhim, javobingiz uchun rahmat.
qo'shib qo'ydi muallif Andy, manba

Ilova ishlayotgan vaqtda signal kelib tushganda muammo yuzaga kelib qolganida, foydalanuvchi faqat qurilma kuch tugmasini bosib, uyquga o'tadi. Keyin, uyqu rejimidan qaytgach, AudioSessionActive kodi bu audiosession turini ishlatib bo'lmaydi kabi narsalar bilan bajarilmaydi. Interruptlisterda AudioSessionSetActive (rost) dan oldin sozlash audiosession xususiyatini qo'shishga harakat qildim, lekin omad yo'q. Nihoyat qo'shildim

retry(~1000 times :) 

ftw)

AudioSessionSetActive(true), 

va u mening muammomni hal qildi.

2
qo'shib qo'ydi
O'ylaymanki, men o'sha kunlarda ishlay boshladim, bu juda tasodifiy edi. Keyinchalik men AVFoundation va AVSession-ga o'tishga harakat qildim. Rostini aytganda, Apple o'zining SDK-da xatolarga duch kelgan deb o'ylayman va bu kod iOS 6 da to'g'ri ishlashi mumkin deb o'ylayman, lekin bu faqat taxmin.
qo'shib qo'ydi muallif Andy, manba

AudioSessionni boshqa holatida faollashtirishni harakat qilib ko'ring:

AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;

[session setCategory: AVAudioSessionCategoryPlayback error: &error];
if (error != nil)
    NSLog(@"Failed to set category on AVAudioSession");

// AudioSession and AVAudioSession calls can be used interchangeably
OSStatus result = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, RouteChangeListener, self);
if (result) NSLog(@"Could not add property listener! %d\n", result);

BOOL active = [session setActive: YES error: nil];
if (!active)
    NSLog(@"Failed to set category on AVAudioSession");

Lekin men bu ishlamasligi mumkin deb o'ylayman, chunki mening holatimda nima sodir bo'ldi, men fonda bo'lganimda bu hech qanday sessiya olmadi. Biroq, Apple-ning aurioTouch misol »ni tahlil qilishga harakat qiling. va faqatgina AppDelegate faylidan o'tib, (void) rioInterruptionListener usulini tahlil qilishga urinib ko'ring.

Jonli translatsiya ovozidan foydalanasizmi? keyin savolning javobini tomosha qilishni tavsiya qilaman, bu erda navbat boshlanishining muammoni hal qilinadi xatoni javobimda berilgan tarzda ko'rib chiqish orqali.

Umid qilamanki, bu sizga yordam berishi mumkin.

0
qo'shib qo'ydi
Men birinchi navbatda, mening savolimning javobidagi narsalarni sinab ko'rish kerakligiga ishonaman. Lekin bu erda aniq masalalarni hal qilish uchun juda qiyin bo'ladi. Siz kodni o'zgartirishni istagan aniq qaerda ekanligini aniqlashingiz kerak. bu men uchun qiyin bo'lgan edi ... Sizga omad kulib boqdi ... Umid qilamanki, siz bu masalani hal qila olasiz ...
qo'shib qo'ydi muallif DShah, manba
Siz kutganingizdek, u ishlamayapti va men sizga bir xil xatoni yanada moda tarzda beradi: "AVAudioSession-da kategoriyani o'rnatib bo'lmadi: operatsiya bajarilmadi (OSStatus error 560161140.)". Men rioInruptrashListenerni tahlil qilishga harakat qilaman. Menimcha, faqat kichik bir narsani sog'indim.
qo'shib qo'ydi muallif Andy, manba

Menga qanday qilib ishim borligini bilib oldim.

Funksiyada

void _audioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState)

olib tashlang

[(NxAudioStreamer*)inClientData handleInterruptionChangeToState:inInterruptionState];

no need to call handleInterruptionChangeToState when you can directly handle it in audioSessionInterruptionListener because audioSessionInterruptionListener has inInterruptionState as a parameter. So modify your to audioSessionInterruptionListener

void _audioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState)
{
    if(inInterruptionState == kAudioSessionBeginInterruption)
    {

        NSLog(@"+Interruption"); 

        if(self.state == NX_STATE_PLAY) 
        {
            [self pause];
            AudioSessionSetActive(FALSE);

            isPausedByInterruption = YES;
        }
    }
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    {
        if(isPausedByInterruption) 
        {
            AudioSessionSetActive(TRUE);
            [self pause];

            isPausedByInterruption = FALSE;
        }

        NSLog(@"-Interruption");
    }
}
0
qo'shib qo'ydi
Men bu haqida gapirib, AVFoundation dan foydalanishni o'ylayman, chunki iOS 3 endi men uchun muhim emas. Har qanday javob uchun rahmat.
qo'shib qo'ydi muallif Andy, manba

Listing 7-16 ga qarang. Agar Ovozli sessiya dasturiy ko'rsatma "cookie kitobi bo'limidagi kodning namunasi (sizning vaziyatingizga mos keladigan ko'rinadi, kAudioSessionCategory_MediaPlayback yordamida) aslida amalga oshirmaydi

AudioSessionSetActive(FALSE);

kAudioSessionBeginIncipruption holatda qo'ng'iroq qiling va

AudioSessionSetActive(TRUE);

kAudioSessionEndInestruption holatda qo'ng'iroq qiling. Albatta, buni qilish kerak deb o'ylamayman. Ushbu post Bu muammoni ham (kAudioSessionIncompatibleCategory olish) yaqqol ko'rinadi. Ikkala qo'ng'iroqni ham sharhlab bersangiz nima bo'ladi?

Dastur sizning foningizda emas, balki oldingi holatdagi sir bo'lib emasligining sababi. Ehtimol, davlatni kuzatib borishingiz kerak (NX_STATE_PLAY bilan ish tutganingizda), keyin ikkita turli usul ("o'zini to'xtatib qo'yish") va [o'zini o'ynash]) bo'lishi mumkin, chunki ehtimol [o'zini to'xtatib qo'yish] kutilmagan son.

0
qo'shib qo'ydi
[O'z-o'zim to'xtatib turish] ikki marta chaqirilgan, shuning uchun asosan AudioQueuePause - to'xtab boshlanishi va AudioQueueStartni to'xtatish oxirida men uni tekshirib ko'rdim, u erda hech qanday muammo yo'q. AudioSessionSetActive (FALSE) kodimni o'chirib tashladim va bu narsalarni mening jurnalimda saqlayapman: VERIFY_OSS AudioSessionSetActive (rost) - '! Cat' VERIFY_OSS AudioQueueStart (audioQueue, NULL) - -12985
qo'shib qo'ydi muallif Andy, manba

kAudioSessionEndInterrash kodingizga ta'sir qilishi mumkin yoki bo'lmasligi mumkin, bu sizning o'yin davlatlaringizni nazorat qilishning ishonchli usuli emas, faqat ovoz sessiyangizni o'chirib qo'ymang, u yana tekshiruvni qo'lga kiritgandan so'ng sessiya qaytadan davom etadi, AudioSessionSetActive (FALSE) sizga yordam beradi.

0
qo'shib qo'ydi
Men sizning fikringizni ko'rmoqchiman, lekin menga ovoz sessiyasini qaytarib olishni davom ettirishga yordam bermaydi :(
qo'shib qo'ydi muallif Andy, manba