Mercurial > ~darius > hgwebdir.cgi > mikmod
comparison playercode/unix_drv/drv_sgi.c @ 8:b30908f9d9f9
Initial entry of mikmod into the CVS tree.
author | darius |
---|---|
date | Fri, 23 Jan 1998 16:05:10 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
7:de95ce2eacfd | 8:b30908f9d9f9 |
---|---|
1 /* | |
2 | |
3 Name: | |
4 DRV_SGI.C, version 0.2 | |
5 Copyright 1996 by Stephan Kanthak, kanthak@i6.informatik.rwth-aachen.de | |
6 | |
7 Version 0.2 - updated to use new driver API | |
8 | |
9 Description: | |
10 Mikmod driver for output on SGI audio system (needs libaudio from the | |
11 dmedia package). | |
12 | |
13 Portability: | |
14 SGI only. Mainly based on voxware driver. | |
15 | |
16 Fragment configuration: | |
17 ======================= | |
18 | |
19 You can use the environment variables 'MM_SGI_FRAGSIZE' and | |
20 'MM_SGI_BUFSIZE' to override the default size of the audio buffer. If you | |
21 experience crackles & pops, try experimenting with these values. | |
22 | |
23 Please read README.SGI first before contacting the author because there are | |
24 some things to know about the specials of the SGI audio driver. | |
25 | |
26 */ | |
27 | |
28 | |
29 #include <stdio.h> | |
30 #include <stdlib.h> | |
31 #include <unistd.h> | |
32 #include <dmedia/audio.h> | |
33 #include "mikmod.h" | |
34 | |
35 #define DEFAULT_SGI_FRAGSIZE 5000 | |
36 #define DEFAULT_SGI_BUFSIZE 10000 | |
37 | |
38 static ALconfig sgi_config; | |
39 static ALport sgi_port; | |
40 static int sample_factor; | |
41 static int sgi_fragsize; | |
42 static int sgi_bufsize; | |
43 static char* audiobuffer; | |
44 | |
45 | |
46 static BOOL SGI_IsThere(void) | |
47 { | |
48 long params[] = { AL_OUTPUT_RATE, 0 }; | |
49 | |
50 ALqueryparams(AL_DEFAULT_DEVICE, params, 2); | |
51 if (params[1] != 0) return 1; | |
52 else return 0; | |
53 } | |
54 | |
55 static BOOL SGI_Init(void) | |
56 { | |
57 char *env; | |
58 int play_rate; | |
59 int fragsize,numfrags; | |
60 long chpars[] = { AL_OUTPUT_RATE, AL_RATE_22050 }; | |
61 | |
62 printf("SGI audio driver: "); | |
63 switch(md_mixfreq) { | |
64 case 22050: | |
65 chpars[1] = AL_RATE_22050; | |
66 break; | |
67 case 44100: | |
68 chpars[1] = AL_RATE_44100; | |
69 break; | |
70 default: | |
71 printf("mixing rate not supported.\n"); | |
72 return 0; | |
73 break; | |
74 } | |
75 ALsetparams(AL_DEFAULT_DEVICE, chpars, 2); | |
76 | |
77 if ((sgi_config = ALnewconfig()) == 0) { | |
78 printf("cannot configure sound device.\n"); | |
79 return 0; | |
80 } | |
81 | |
82 if (md_mode & DMODE_16BITS) { | |
83 if (ALsetwidth(sgi_config, AL_SAMPLE_16) < 0) { | |
84 printf("samplesize of 16 bits not supported.\n"); | |
85 return 0; | |
86 } | |
87 sample_factor = 2; | |
88 } else { | |
89 if (ALsetwidth(sgi_config, AL_SAMPLE_8) < 0) { | |
90 printf("samplesize of 8 bits not supported.\n"); | |
91 return 0; | |
92 } | |
93 sample_factor = 1; | |
94 } | |
95 | |
96 if (md_mode & DMODE_STEREO) { | |
97 if (ALsetchannels(sgi_config, AL_STEREO) < 0) { | |
98 printf("stereo mode not supported.\n"); | |
99 return 0; | |
100 } | |
101 } else{ | |
102 if (ALsetchannels(sgi_config, AL_MONO) < 0) { | |
103 printf("mono mode not supported.\n"); | |
104 return 0; | |
105 } | |
106 } | |
107 | |
108 if(!VC_Init()){ | |
109 return 0; | |
110 } | |
111 | |
112 sgi_fragsize=(env=getenv("MM_SGI_FRAGSIZE")) ? atol(env) : DEFAULT_SGI_BUFSIZE; | |
113 sgi_bufsize=(env=getenv("MM_SGI_BUFSIZE")) ? atol(env) : DEFAULT_SGI_BUFSIZE; | |
114 | |
115 ALsetqueuesize(sgi_config, sgi_bufsize); | |
116 if ((sgi_port = ALopenport("Mod4X", "w", sgi_config)) == 0) { | |
117 printf("cannot open SGI audio port.\n"); | |
118 return 0; | |
119 } | |
120 printf("%dHz/%dBits/", md_mixfreq, 8*sample_factor); | |
121 if (md_mode & DMODE_STEREO) printf("stereo.\n"); | |
122 else printf("mono.\n"); | |
123 | |
124 | |
125 audiobuffer = (char*) MyMalloc(sgi_fragsize * sizeof(char)); | |
126 | |
127 if(audiobuffer==NULL){ | |
128 VC_Exit(); | |
129 return 0; | |
130 } | |
131 | |
132 return 1; | |
133 } | |
134 | |
135 | |
136 static void SGI_Exit(void) | |
137 { | |
138 free(audiobuffer); | |
139 VC_Exit(); | |
140 } | |
141 | |
142 | |
143 static void SGI_Update(void) | |
144 { | |
145 VC_WriteBytes(audiobuffer, sgi_fragsize); | |
146 ALwritesamps(sgi_port,audiobuffer, sgi_fragsize/sample_factor); | |
147 } | |
148 | |
149 | |
150 DRIVER drv_sgi={ | |
151 NULL, | |
152 "SGI Audio System", | |
153 "SGI Audio System Driver v0.2 - by Stephan Kanthak", | |
154 SGI_IsThere, | |
155 VC_SampleLoad, | |
156 VC_SampleUnload, | |
157 VC_SampleSpace, | |
158 VC_SampleLength, | |
159 SGI_Init, | |
160 SGI_Exit, | |
161 VC_SetNumChannels, | |
162 VC_PlayStart, | |
163 VC_PlayStop, | |
164 SGI_Update, | |
165 VC_VoiceSetVolume, | |
166 VC_VoiceSetFrequency, | |
167 VC_VoiceSetPanning, | |
168 VC_VoicePlay, | |
169 VC_VoiceStop, | |
170 VC_VoiceStopped, | |
171 VC_VoiceReleaseSustain, | |
172 VC_VoiceGetPosition, | |
173 VC_RealVolume | |
174 }; |