⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sndsrv.c

📁 LBreakout a breakout-style arcade game for Linux Requirements: X11, SDL[1.0 or better] Inst
💻 C
字号:
/***************************************************************************                          sndsrv.c  -  description                             -------------------    begin                : Thu Apr 20 2000    copyright            : (C) 2000 by Michael Speck    email                : kulkanie@gmx.net ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "sndsrv.h"#ifdef SOUND#include <stdlib.h>#include <string.h>#include <SDL_video.h>extern char *src_dir;// Wave //Wave* Wave_Load(char *fname){    Wave *w;    char path[strlen(src_dir) + strlen(fname) + 1];    sprintf(path,"%s%s",src_dir,fname);    w = (Wave*)malloc(sizeof(Wave));    if (w == 0) {        fprintf(stderr, "ERR: wave_load: not enough memory\n");        exit(1);    }	    w->buf = 0;    w->len = 0;	printf( "LoadWaV\n" );    if (SDL_LoadWAV(path, &w->spec, &w->buf, &w->len) == 0) {        fprintf(stderr, "ERR: wave_load: %s\n", SDL_GetError());        exit(1);    }    w->spec.callback = 0;    w->spec.userdata = 0;    return w;}void Wave_Free(Wave *w){    if (w->buf) SDL_FreeWAV(w->buf);    free(w);}void Wave_Format(Wave *w, SDL_AudioSpec dest){    SDL_AudioCVT cvt;    printf("dst:\n");    printf("ch: %i | smpls: %i | fmt: %i\n", dest.channels, dest.format, dest.samples);    printf("src:\n");    printf("ch: %i | smpls: %i | fmt: %i\n", w->spec.channels, w->spec.format, w->spec.samples);    if (dest.channels != w->spec.channels || dest.format != w->spec.format || dest.samples != w->spec.samples) {        SDL_BuildAudioCVT(&cvt, w->spec.format, w->spec.channels, w->spec.samples, dest.format, dest.channels, dest.samples);        cvt.len = w->len;        cvt.buf = (char*)malloc(cvt.len * cvt.len_mult);        memcpy(cvt.buf, w->buf, w->len);        SDL_ConvertAudio(&cvt);        SDL_FreeWAV(w->buf);        w->buf = cvt.buf;    }}// Soundserver //SndSrv sndsrv;void SndSrv_Init(int t){    int i;    sndsrv.tracks = (Track*)malloc(sizeof(Track) * t);    sndsrv.track_num = t;    for (i = 0; i < t; i++)        sndsrv.tracks[i].wave = 0;    SndSrv_SetVolume(8);    sndsrv.playing = 0;    sndsrv.ok = 1;}void SndSrv_Quit(){    free(sndsrv.tracks);}int SndSrv_Open(SDL_AudioSpec wanted) {    sndsrv.spec.callback = SndSrv_Callback;    sndsrv.spec.userdata = 0;    if (SDL_OpenAudio(&sndsrv.spec, 0) < 0) {    	fprintf(stderr, "ERR: sndsrv_open: %s\n", SDL_GetError());    	sndsrv.ok = 0;    	return 1;    }    SndSrv_Pause(0);    sndsrv.playing = 0;    sndsrv.sleeping = 0;    return 0;}void SndSrv_Close(){    if (sndsrv.ok)        SDL_CloseAudio();}void SndSrv_Pause(int p){    if (!sndsrv.ok) return;    SDL_PauseAudio(p);    if (p) sndsrv.playing = 0;}void SndSrv_Play(Wave *w, int p){    int j;	printf( "Play Wav\n" );    if (sndsrv.sleeping || !sndsrv.ok) return;    //use free track if possible    for (j = 0; j < sndsrv.track_num; j++)        if (sndsrv.tracks[j].wave == 0) {            //empty            sndsrv.tracks[j].wave = w;            sndsrv.tracks[j].audio_pos = w->buf;            sndsrv.tracks[j].len = w->len;            sndsrv.playing++;            SndSrv_Pause(0);            return;        }    for (j = 0; j < sndsrv.track_num; j++)        if (sndsrv.tracks[j].priority <= p) {           	//lower priority found            sndsrv.tracks[j].wave = w;            sndsrv.tracks[j].audio_pos = w->buf;            sndsrv.tracks[j].len = w->len;            sndsrv.playing++;            SndSrv_Pause(0);            return;        }    return; //cannot play sound, no track available}void SndSrv_SetVolume(char v){    sndsrv.volume = v < 0 ? 0 : v > 8 ? 8 : v;    if (sndsrv.volume) sndsrv.volume = sndsrv.volume * 16 - 1;}void SndSrv_SetActive(int a){    sndsrv.sleeping = !a;}void SndSrv_Callback(void *udata, unsigned char *stream, int str_len){    int i, len;    Track *track;    if (sndsrv.sleeping || !sndsrv.ok) return;    for (i = 0; i < sndsrv.track_num; i++) {       	track = &sndsrv.tracks[i];        if (track->wave == 0) continue;        len = str_len < track->len ? str_len : track->len;        SDL_MixAudio(stream, track->audio_pos, len, sndsrv.volume);        track->len -= len;        track->audio_pos += len;        if (track->len == 0) {            track->wave = 0;            sndsrv.playing--;        }        if (!sndsrv.playing) SndSrv_Pause(1);    }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -