كيف يمكن للمرء أن يقفز إلى إزاحة معينة أكثر من مرة؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

تخيل هذه الوظيفة:

void SoundManager::playSource(ALuint sourceID, float offset)
{
    alSourceStop(sourceID);

    ALint iTotal = 0;
    ALint iCurrent = 0;
    ALint uiBuffer = 0;
    alGetSourcei(sourceID, AL_BUFFER, &uiBuffer);
    alGetBufferi(uiBuffer, AL_SIZE, &iTotal);
    iCurrent = iTotal * offset;

    alSourcei(sourceID, AL_BYTE_OFFSET, iCurrent);
    alSourcePlay(sourceID);
}

الفكرة هي الاتصال playSource(x, 0.5f) سوف تقفز إلى (تقريبًا) في منتصف الطريق عبر المخزن المؤقت ، إلخ.

إنه يعمل بشكل جيد في المرة الأولى التي أسميها ، لكن إذا أسميته مرة أخرى على نفس المصدر (سواء كان ذلك المصدر يلعب أم لا) ، فإنه يبدأ في اللعب كما لو كنت أطلق عليه مع الإزاحة 0.

أي أفكار لماذا؟

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

المحلول

تم حلها!

على الرغم من أن واجهة برمجة التطبيقات تدعي أن تعيين الإزاحة يعمل على مصادر في أي ولاية ، إلا أن المشكلة كانت يجب أن أتصل alSourceRewind بدلاً من alSourceStop في البداية.

يبدو أن إعداد الإزاحة يعمل فقط على مصادر في AL_INITIAL حالة.

نصائح أخرى

يمكنك تشغيل ملف الصوت أولاً ، ثم اتصل setOffset مثل هذا ، لا تحتاج إلى الاتصال alSourcePlay:

- (BOOL)setOffset:(float)offset
{
  ALint iTotal = 0;
  ALint iCurrent = 0;
  ALint uiBuffer = 0;
  alGetSourcei(_sourceID, AL_BUFFER, &uiBuffer);
  alGetBufferi(uiBuffer, AL_SIZE, &iTotal);
  iCurrent = iTotal * offset;
  alSourcei(_sourceID, AL_BYTE_OFFSET, iCurrent);
  return ((_error = alGetError()) != AL_NO_ERROR);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top