Подвійна буферизація

Вибір пристрою відтворення звуку в операційній системі Mac OS нескладний Повідомте системі тип виробленого вашою програмою звуку (в нашому випадку sampledSynth), а система підбере вам відповідне пристрій Для використання подвійної буферизації знадобиться структура SndDoubleBufferHeader, в якій містяться покажчики на дві структури SndDoubleBuffer Останні і є безпосередньо буферами, які вимагають ініціалізації

Відзначимо два цікавих відмінності від інших систем Перше полягає в описі частоти дискретизації як змінної типу Fixed, що дозволяє використовувати дробові частоти дискретизації Другим відмінністю є те, що функції зворотного виклику вимагають особливого поводження Так як операційна система Mac OS для PowerPC являє собою суміш власних програм для PowerPC і програм для емульованого процесора 680×0, покажчики на функції зворотного виклику повинні бути описані як універсальні покажчики на процедури (Universal procedure pointers), використання яких дозволить обом типам системних програм коректно звертатися до функцій, визначених у вашій власній програмі Te ж самі виклики застосовуються і в Mac OS для процесора 680×0, хоча на низькому рівні їх реалізація простіше

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

void MacPlayer::Play(void (*serviceFunc)(void)) { SCStatus         Stats

SndChannelPtr      chan

chan = nil

OSErr err = SndNewChannel (&ampchan, sampledSynth, 0, nil)

if (err = noErr) Debugger()

SndDoubleBufferHeader doubleHeader doubleHeaderdbhNumChannels = Channels () doubleHeaderdbhSampleSize = 16 / / Кількість бітів

/ / На відлік

doubleHeaderdbhCompressionID = 0 / / Звук НЕ стиснутий

doubleHeaderdbhPacketSize = 0 / / He використовується,

doubleHeaderdbhSampleRate =

/ / Так як немає компресії

static_cast&ltFixed&gt(SamplingRate()) &lt&lt 16

/ * Створюємо UPP для SndDoubleBackProc * /

doubleHeaderdbhDoubleBack = NewSndDoubleBackProc(NextBlockCallback)

/ / Ініціалізація черзі після

/ / Проведених погоджень

InitializeQueue (128 * 1024L) / / Виділяємо 128 Кб під чергу

for (int i = 0 i &lt= 1 ++i) { SndDoubleBufferPtr doubleBuffer =

reinterpret_cast&ltSndDoubleBufferPtr&gt (NewPtrClear(sizeof(SndDoubleBuffer) +

doubleBufferSize*2))

doubleHeaderdbhBufferPtr [i] = doubleBuffer

if ((doubleBuffer == nil) || (MemError() = 0)) Debugger()

doubleBuffer-&gtdbNumFrames = 0

doubleBuffer-&gtdbFlags = 0

doubleBuffer-> dbUserInfo [0] = static_cast (this) NextBlockCallback (chan, doubleBuffer) / / Ініціалізація

/ / Буферів

}

err = SndPlayDoubleBuffer (chan, &ampdoubleHeader)

if (err = noErr) Debugger()

do {

FillQueue () / / Підтримуємо наповнення черги

if (serviceFunc)

serviceFunc () / / Викликаємо функції сервісу

err = SndChannelStatus (chan, sizeof (Stats), &ampStats)

} while (StatsscChannelBusy)

DisposePtr ((Ptr) doubleHeaderdbhBufferPtr[0]) DisposePtr ((Ptr) doubleHeaderdbhBufferPtr[1]) err = SndDisposeChannel (chan,0)

if (err = noErr)

Debugger()

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*