1 
2 /*
3  *   O2EM Free Odyssey2 / Videopac+ Emulator
4  *
5  *   Created by Daniel Boris <dboris@comcast.net>  (c) 1997,1998
6  *
7  *   Developed by Andre de la Rocha <adlroc@users.sourceforge.net>
8  *
9  *   http://o2em.sourceforge.net
10  *
11  *
12  *
13  *   O2 Voice emulation
14  */
15 
16 
17 #include <stdio.h>
18 #include "vmachine.h"
19 #include "cpu.h"
20 #include "voice.h"
21 #include "allegro.h"
22 
23 
24 static SAMPLE *voices[9][128];
25 static int voice_bank=0;
26 static int voice_num=-1;
27 static int voice_addr=0;
28 static int voice_ok=0;
29 static int voice_st=0;
30 static unsigned long clk_voice_start=0;
31 
32 
load_voice_samples(void)33 void load_voice_samples(void){
34 	int bank, sam, i, ld=0;
35 	char name[40];
36 	SAMPLE *sp=NULL;
37 
38 	printf("Loading voice samples...  ");
39 	fflush(stdout);
40 
41 	for (i=0; i<9; i++) {
42 		for (sam=0; sam<128; sam++) {
43 
44 			if (i)
45 				bank = 0xE8+i-1;
46 			else
47 				bank = 0xE4;
48 
49 			sprintf(name,"voice/%02x%02x.wav",bank,sam+0x80);
50 
51 			voices[i][sam] = load_sample(name);
52 
53 			if (!voices[i][sam]) {
54 				sprintf(name,"voice/%02X%02X.WAV",bank,sam+0x80);
55 				voices[i][sam] = load_sample(name);
56 			}
57 
58 			if (voices[i][sam]) {
59 				ld++;
60 				if (!sp) sp = voices[i][sam];
61 			}
62 
63 		}
64 	}
65 
66 	printf("%d samples loaded\n",ld);
67 
68 	if (ld>0){
69 		voice_num = allocate_voice(sp);
70 		if (voice_num != -1)
71 			voice_ok=1;
72 		else {
73 			printf("  ERROR: could not allocate sound card voice\n");
74 			voice_ok=0;
75 		}
76 	}
77 
78 }
79 
80 
update_voice(void)81 void update_voice(void){
82 	if (!voice_ok) return;
83 	if (voice_st==2) {
84 		if (voice_get_position(voice_num) < 0){
85 			if ((voice_bank>=0) && (voice_bank<9) && (voice_addr>=0x80) && (voice_addr<=0xff)) {
86 				if (voices[voice_bank][voice_addr-0x80]) {
87 					reallocate_voice(voice_num, voices[voice_bank][voice_addr-0x80]);
88 					voice_set_volume(voice_num, (255*app_data.vvolume)/100);
89 					voice_start(voice_num);
90 					clk_voice_start = clk_counter;
91 					voice_st=1;
92 				} else {
93 					voice_st=0;
94 				}
95 			}
96 		}
97 	} else if (voice_st==1) {
98 		if ((voice_get_position(voice_num) < 0) || (clk_counter-clk_voice_start>20) ) {
99 			voice_st=0;
100 		}
101 	}
102 }
103 
104 
trigger_voice(int addr)105 void trigger_voice(int addr){
106 	if (voice_ok){
107 		if (voice_st) update_voice();
108 		if ((voice_st==0) && (voice_bank>=0) && (voice_bank<9) && (addr>=0x80) && (addr<=0xff)){
109 			voice_addr = addr;
110 			voice_st = 2;
111 			update_voice();
112 		}
113 	}
114 }
115 
116 
set_voice_bank(int bank)117 void set_voice_bank(int bank){
118 	if (!voice_ok) return;
119 	if ((bank>=0) && (bank<=8)) voice_bank = bank;
120 }
121 
122 
get_voice_status(void)123 int get_voice_status(void){
124 	if (voice_ok){
125 		update_voice();
126 		if (voice_st) return 1;
127 	}
128 	return 0;
129 }
130 
131 
reset_voice(void)132 void reset_voice(void){
133 	if (voice_ok) {
134 		voice_stop(voice_num);
135 		voice_bank=0;
136 		voice_addr=0;
137 		voice_st=0;
138 	}
139 }
140 
141 
mute_voice(void)142 void mute_voice(void){
143 	if (voice_ok) {
144 		voice_stop(voice_num);
145 	}
146 }
147 
148 
close_voice(void)149 void close_voice(void){
150 	reset_voice();
151 	voice_ok=0;
152 }
153 
154 
155