الحصول على إشعار عند الانتهاء من تشغيل الصوت في OpenAL

StackOverflow https://stackoverflow.com/questions/1046315

سؤال

أنا أستخدم OpenAL على iPhone لتشغيل عينات صوتية متعددة في وقت واحد.

هل يمكنني جعل OpenAL يخطرني عند الانتهاء من تشغيل عينة واحدة؟

أرغب في تجنب ترميز طول العينة وتعيين مؤقت.

هل كانت مفيدة؟

المحلول

إذا كان لديك مصدر مكتبة الصوت المفتوحة المستخرجة في طبقة، أعتقد أنك يمكن أن مجرد دعوة performSelector:afterDelay: عند بدء تشغيل الصوت:

- (void) play
{
    [delegate performSelector:@selector(soundHasFinishedPlaying)
        afterDelay:self.length];
    …
}

و(إذا قمت بإيقاف الصوت يدويا في هذه الأثناء، يمكن إلغاء الاستدعاء، انظر في NSObject الدرجة المرجعي ) أو يمكنك الاستقصاء AL_SOURCE_STATE:.

- (void) checkStatus
{
    ALint state;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING)
        return;
    [timer invalidate];
    [delegate soundHasFinishedPlaying];
}

وأنا لا أعرف كيف يكون مكتبة الصوت المفتوحة الاتصال بك. بالضبط ما تريد من رد عنه؟ بعض الأشياء لا يمكن حلها على نحو أفضل دون رد.

نصائح أخرى

ولم يكن لدي الكثير من الحظ مع الاسترجاعات في مكتبة الصوت المفتوحة. في أجهزة الدولة بلدي، وأنا ببساطة استطلاع المصدر وتأخير الانتقال حتى يتم ذلك.


    - (BOOL)playing {
        ALint sourceState;
        alGetSourcei(sourceID, AL_SOURCE_STATE, &sourceState);
        return sourceState == AL_PLAYING;
    }

// ... //

    case QSTATE_DYING:
        if (![audioSource playing])
            [self transitionTo:QSTATE_DEAD];

وإذا لم يكن هذا ما تحتاج إليه، ثم كنت أفضل رهان هو على الارجح جهاز توقيت. يجب أن لا تحتاج إلى ترميز ثابت للأي القيم. يمكنك تحديد مدة تشغيل عندما كنت ملء المخازن الخاصة بك.

وقليلا من التبصر في "لماذا" في هذه المسألة قد تقدم بعض خيارات إضافية.

هذا الدليل مكتبة الصوت المفتوحة يقترح حلا ممكنا:

<اقتباس فقرة>   

والدالة 'تيار' يروي لنا أيضا إذا تم الانتهاء من تيار اللعب.

... ويوفر شفرة المصدر عينة لتوضيح الاستخدام.

انتظر، هل تتحدث عن الانتهاء عينة واحدة (على سبيل المثال، 1/44100 ثانية للصوت بتردد 44.1 كيلو هرتز)؟أم أنك تتحدث عن معرفة أن المصدر قد تم تشغيله من خلال المخزن المؤقت الخاص به وليس لديه المزيد من الصوت لتشغيله؟

بالنسبة للأخيرة، حصلت على نتائج جيدة من خلال استقصاء مصدر لخاصية AL_BUFFERS_PROCESSED عندما أقوم بدفق المخازن المؤقتة إلى مصدر ما؛قد يكون من المفيد لحالة المخزن المؤقت المفرد البحث عن قيمة غير صفرية لهذه الخاصية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top