Программирование игр для Windows. Советы профессионала

Демонстрационная программа Test.c


Ниже приводится демонстрационная программа на языке Си, которая показы­вает, как загружать и работать с драйверами DIGPAK и MIDPAK.

/*                                                              */

/* TEST.C Демонстрационная программа работы с драйверами DIGPAK */

/* и MIDPAK. Динамически загружает драйверы DIGPAK

и MIDPAK,    */

/* SOUNDRV.COM и MIDPAK.COM/MIDPAK.ADV/MIDPAK.AD. Затем         */

/* воспроизводит MIDI-файл TEST.XMI, позволяя вам исполнять     */

/* звуковые эффекты TEST1.SND и TEST2.SND                       */ /****************************************************************/

/*      Автор: John W. Ratcliff (с) 1994                        */

/*               CompuServe: 70253,3237                         */

/*               Genie: J.RATCLIFF3                             */

/*               BBS: 1-314-939-0200                            */

/*               Адрес:                                         */



/*                          747 Napa Lane                       */

/*                          St. Charles, МО 63304               */

/*                                                              */

/*                                                              */

/*********************************************'******************/

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include "keys.h"         // Включает определения для

// клавиатурных команд

#include "support.h"      // Включает файл заголовка базовых

// функций поддержки

#include "loader.h"       // Включает файл заголовка динамического

        // загрузчика MIDPAK/DIGPAK

#include "midpak.h"       // Включает файл заголовка функций

// нижнего уровня MIDPAK

#include "digplay.h"      // Включает файл заголовка функций

// нижнего уровня DIGPAK

#include "doscalls.h"     // Включает файл заголовка

// DOS-функций поддержки

#define NOBJ 4            // число загружаемых звуковых эффектов




static char *Names [NOBJ]= // имена файлов звуковых эффектов

{

"TEST1.SND", "TEST2.SND", "PEND.3ND", "TEST.SND" };

static SNDSTRUC *snd;        // Структура звуковых данных DIGPAK

static char *soundbuffer=0;  // Адрес буфера звуковых данных

static long int ssize[NOBJ]; // Длина загружаемого звукового эффекта

static int NALLOC=0;

char *Sounds[NOBJ];          // адреса всех звуковых эффектов

void UnloadSounds(void);     // Выгрузка звуковых эффектов из памяти

int  LoadSounds(void);       // Загрузка звуковых эффектов в память

void PlaySound(int sound);   // Воспроизведение звукового эффекта

void TestDigPak(void);       // Тестирование функций       

// воспроизведения DIGPAK

// Приложение должно обеспечить функции резервирования памяти. Они

// используются загрузчиком и DOS функциями поддержки. Вы можете

// заменить эти функции любой другой системой управления памятью.

unsigned char far * far memalloc(long int siz) {

unsigned char far *mem;

mem = farmalloc(siz) ; // функция Си для резервирования

                  // памяти по дальнему адресу return(mem);

}

void far memfree(char far *тетогу)

farfree(memory); // функция Си для освобождения памяти по

// дальнему адресу

}

void main(void)

{

long int siz;

char *fname;

// Вызов загрузчика для начальной загруаки стандартного

// драйвера DIGPAK

if ( !LoadDigPak("SOUNDRV.COM") )

{

printf("Failed to load sound driver.\n");

exit(l);

} if ( !InitDigPak() ) // Инициализация драйвера DIGPAK

{

// Выгрузка драйвера из памяти в случае неудачной

// инициализации и завершение работы программы.

UnLoadDigPak();

printf("Failed to initialize sound driver.\n") ;

exit(l);

}

if ( LoadMidPak('MIDPAK.COM", "MIDPAK.ADV", "MIDPAK.AD") ) // Загрузка компонентов MIDPAK {

printf("Loaded MIDPAK.СОМ MIDPAK.ADV and MIDPAK.AD into Low Men\n");

if ( InitMidPak() )

{

printf("MIDPAK driver initialized.\n");



fname = floadlow("TEST.XMI",&siz); // Загрузка музыки

if ( fname }

{

printf("Loaded TEST.XMI %d bytes long.\n",siz);

RegisterXmidi(fname,siz); // Регистрация XMIDI

// последовательности

printf("Sequence registered, now playing.\n") ;

PlaySequence(0); // Исполнить первую

// последовательность

SegueSequence (1,-1); // Зарегистрировать вторую

// последовательность на

// исполнение сразу же по

// достижении первого

// Контроллера 119

}

} else

printf("Failed to initialize MIDPAK driver.\n");

}

TestDigPak(); // Тестирование/демонстрация возможностей функций

// DIGPAK

UnLoadMidPak(); // Выгрузка MIDPAK из памяти,

// освобождение аппаратуры

UnLoadDigPak(); // Выгрузка DIGPAK из памяти,

// освобождение аппаратуры

RemoveVectorLoader() ;

}

void TestDigPak(void)

{

int i,key,sound;

printf("Loading digital sound effects.\n");

if ( LoadSounds() ) // Загрузка звуковых эффектов в память

{

// Создание меню звуковых эффектов

printf(" Select an sound effect to play. [ESC] when finished playing around.\n");

for (i=0; i<NOBJ; i++)

{

printf("%c %s\n",i+'A',Names[i]) ;

}

do

{

if ( keystat() ) // если клавиша нажата

{

key = getkey(); // получить нажатую клавишу

if ( key >= ' a' && key <= ' z') key-=32;

// преобразовать нижний регистр к верхнему

if ( key >= 'А' && key <= 'Z')

{

sound = key-'A';

if ( sound < NOBJ ) PlaySound(sound);

}

} while ( key != 27 );

UnloadSounds(} ;

}

}

// загрузить все звуковые эффекты в память

int LoadSounds(void)

{

int fph;

long int siz.end;

int i, handler;

int select;

for (i=0; i<NOBJ; i++)

{

Sounds[i] = fload(Names[i], &siz);;

if ( !Sounds[i] )

{

printf("File '%s' not found.\n"/Names[i]) ;

return(0) ;

}

ssize[i] = siz;

snd.frequency = 11000;

snci. sound = Sounds [i];

snd.sndlen = ssize[i]; // задает длину звукового эффекта

//в байтах

MassageAudio(&snd) ;

printf("Sound Loaded '%s'.\n",Names[i]);

}

return(1) ;

}

void UnloadSounds(void) {

int i;

for (i=0; i < nalloc; i++) memfree(Sounds[i]);

if ( soundbuffer )

{

realfree(snd) ;

realfree(soundbuffer);

}

NALLOC=0 ;

}

void PlaySound(int sound)

{

if ( !soundbuffer }

{

snd = (SNDSTRUC *) realalloc(sizeof(SNDSTRUC));

snd->frequency = 11000;

soundbuffer = realalloc(65535);

}

StopSound(); // ожидать до окончания предыдущего звукового эффекта

snd.frequency = 11000;

snd.sound = Sounds[i];

snd.sndlen = ssize[i]; // задает длину звукового эффекта

//в байтах

DigPlay2(&snd); // воспроизвести эффект

//в аппаратно-зависимом формате

}


Содержание раздела