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


Использование функций драйвера для проигрывания VOC-файлов - часть 3


То есть мы должны:

§          Открыть файл в бинарном режиме;

§          Отвести под него память;

§          Загрузить VOC-файл в отведенный буфер. Это делает функция Листинга 9.2.

Листинг 9.2. Загрузка VОС-файла.

char far *Voc_Load_Sound(char *filename,

unsigned char *header_length)

{ // загрузка звукового файла с диска в память

// и установка указателя на его начало

char far *temp_ptr;

char far *data_ptr;

unsigned int sum;

int sound_handle,t;

unsigned errno, segment, offset, num_para, bytes_read;

// открыть

звуковой файл

_dos_open(filename, _O_RDONLY, &sound_handle);

// выделить

память

num_para =1 + (filelength(sound_handle))/16;

_dos allocmem(num_para, &segment) ;

// установить указатель на выделенную память

_FP_SEG(data_ptr) = segment;

_FP_OFF(data_ptr) = 0;

// загрузить звуковые данные

temp_ptr

= data_ptr;

do

{

dos_read(sound_handle,temp_ptr, 0х4000, &bytes__read) ;

temp_ptr += bytes_read;

sum+=bytes_read;

} while(bytes_read==0x4000);

// Проверить на всякий случай, звуковые ли это данные.

// Для этого проверяется присутствие слова "Creative".

if ((data_ptr[0] != 'С') || (data_ptr[1] != 'r'))

{

printf("\n%s is riot a voc file!",filename);

_dos_freemem(_FP_SEG(data_ptr) ) ;

return(0);

} // конец звукового файла

header_length = (unsigned char)data_ptr[20];

// закрыть

файл

_dosclose(sound_handle) ;

return(data_ptr) ;

} // конец функции

Наиболее замечательное в этой функции то, что она возвращает адрес области памяти (точнее, указатель на него), куда был загружен VOC-файл. Мы используем этот указатель позже при проигрывании звука.

Все остальные функции, которые нам потребуются, тривиальны. Мы используем ассемблерные вставки для настройки регистров и команду процессора CALL для вызова драйвера с помощью указателя driver_ptr.

Рассмотрим несколько таких функций, чтобы понять особенности их написания.


Начало  Назад  Вперед