Виклик підсистеми

B функції зворотного виклику використовується стандартний метод узгодження характерного для мови C механізму зворотних викликів з класами C + + Як і більшість систем, що дозволяють використовувати зворотні виклики, Windows дозволяє застосувати єдиний покажчик, який буде передаватися цієї функції (B Windows параметр dwInstance описується як DWORD, проте він майже завжди використовується для передачі покажчика) Я вирішив цього покажчику зберігати значення this Функція зворотного виклику отримує цей параметр і застосовує його для передачі повідомлення в обєкт Ось таким чином функція WaveOutCallback перетворює виклик функції мови C в ініціювання методу мови C + +

Лістинг 63 Реалізація класу WinPalyer (продовження)

//

void CALLBACK WaveOutCallback(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParaml, DWORD dwParam2) { WinPlayer *me = reinterpret_cast&ltWinPlayer *&gt(dwInstance) switch(uMsg) {

case WOM_DONE: / / C цим буфером закінчено

{

WAVEHDR *pWaveHdr = reinterpret_cast&ltWAVEHDR

*&gt(dwParam1)

me-&gtNextBuff(pWaveHdr)

break

} default: break

}

}

Розглянута функція зворотного виклику управляється з методу NextBuff, який заповнює буфер і передає його керуючої звуком подпрограмме Windows

Лістинг 63 Реалізація класу WinPlayer (продовження)

void WinPlayer::NextBuff(WAVEHDR *pWaveHdr) {

long samplesRead = 0 switch(_sampleWidth) { case 16:

samplesRead = FromQueue(

reinterpret_cast&ltSample16 *&gt(pWaveHdr-&gtlpData), winBufferSize)

break

case 8:

samplesRead = FromQueue(

reinterpret_cast&ltSample8 *&gt(pWaveHdr-&gtlpData), winBufferSize)

break

}

if (samplesRead = 0) {/ / Якщо є дані, то їх треба

/ / Записати

pWaveHdr-&gtdwBufferLength = samplesRead * _sampleWidth / 8

waveOutWrite(_device, pWaveHdr, sizeof(*pWaveHdr))

} Else if ( _endOfQueue) {/ / Ой Пропав джерело сигналу

waveOutPause (_device) / / Пристрій виведення переводимо

/ / В стан паузи

_paused = true

/ / Відтворення перервано через

/ / Перебоїв з отриманням даних

cerr &lt&lt &quotSound output paused due to lack of data\n"

/ / Пишемо кілька нулів, щоб

/ / Зберегти блок в черзі

// Windows memset(pWaveHdr-&gtlpData,0,winBufferSize) pWaveHdr-&gtdwBufferLength = 256

waveOutWrite(_device,pWaveHdr,sizeof(*pWaveHdr))

} Else {/ / Дані все, робота закінчена

pWaveHdr-> dwFlags | = WHDR_DONE / / Позначаємо буфер як

/ / Минулий обробку

}

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*