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