annotate Plugins/Input/adplug/core/msc.cpp @ 637:2b06eb5e472d trunk

[svn] Sync with upstream. Drop hardware OPL2/3 support, it throws warnings and is not used on most modern machines. Added var inits where GCC 4.0 thought it was a good idea.
author chainsaw
date Sat, 18 Feb 2006 08:23:30 -0800
parents 15ca2ea93a30
children 6ad7eb96dd26
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
1 /*
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
2 * Adplug - Replayer for many OPL2/OPL3 audio file formats.
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
3 * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
4 *
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
9 *
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
13 * Lesser General Public License for more details.
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
14 *
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
18 *
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
19 * msc.c - MSC Player by Lubomir Bulej (pallas@kadan.cz)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
20 */
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
21
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
22 #include <stdio.h>
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
23
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
24 #include "msc.h"
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
25
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
26 const unsigned char CmscPlayer::msc_signature [MSC_SIGN_LEN] = {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
27 'C', 'e', 'r', 'e', 's', ' ', '\x13', ' ',
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
28 'M', 'S', 'C', 'p', 'l', 'a', 'y', ' ' };
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
29
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
30
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
31 /*** public methods *************************************/
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
32
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
33 CPlayer *
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
34 CmscPlayer::factory (Copl * newopl)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
35 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
36 return new CmscPlayer (newopl);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
37 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
38
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
39
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
40 CmscPlayer::CmscPlayer (Copl * newopl) : CPlayer (newopl) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
41 desc = NULL;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
42 msc_data = NULL;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
43 raw_data = NULL;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
44 nr_blocks = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
45 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
46
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
47
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
48 CmscPlayer::~CmscPlayer ()
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
49 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
50 if (raw_data != NULL)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
51 delete [] raw_data;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
52
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
53 if (msc_data != NULL) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
54 // free compressed blocks
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
55 for (int blk_num = 0; blk_num < nr_blocks; blk_num++) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
56 if (msc_data [blk_num].mb_data != NULL)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
57 delete [] msc_data [blk_num].mb_data;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
58 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
59
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
60 delete [] msc_data;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
61 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
62
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
63 if (desc != NULL)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
64 delete [] desc;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
65 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
66
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
67
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
68 bool
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
69 CmscPlayer::load (const std::string & filename, const CFileProvider & fp)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
70 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
71 binistream * bf;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
72 msc_header hdr;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
73
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
74 // open and validate the file
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
75 bf = fp.open (filename);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
76 if (! bf)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
77 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
78
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
79 if (! load_header (bf, & hdr)) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
80 fp.close (bf);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
81 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
82 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
83
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
84 // get stuff from the header
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
85 version = hdr.mh_ver;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
86 timer_div = hdr.mh_timer;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
87 nr_blocks = hdr.mh_nr_blocks;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
88 block_len = hdr.mh_block_len;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
89
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
90 if (! nr_blocks) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
91 fp.close (bf);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
92 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
93 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
94
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
95 // load compressed data blocks
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
96 msc_data = new msc_block [nr_blocks];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
97 raw_data = new u8 [block_len];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
98
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
99 for (int blk_num = 0; blk_num < nr_blocks; blk_num++) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
100 msc_block blk;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
101
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
102 blk.mb_length = bf->readInt (2);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
103 blk.mb_data = new u8 [blk.mb_length];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
104 for (int oct_num = 0; oct_num < blk.mb_length; oct_num++) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
105 blk.mb_data [oct_num] = bf->readInt (1);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
106 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
107
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
108 msc_data [blk_num] = blk;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
109 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
110
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
111 // clean up & initialize
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
112 fp.close (bf);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
113 rewind (0);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
114
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
115 return true;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
116 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
117
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
118
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
119 bool
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
120 CmscPlayer::update ()
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
121 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
122 // output data
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
123 while (! delay) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
124 u8 cmnd;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
125 u8 data;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
126
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
127 // decode data
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
128 if (! decode_octet (& cmnd))
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
129 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
130
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
131 if (! decode_octet (& data))
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
132 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
133
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
134 // check for special commands
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
135 switch (cmnd) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
136
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
137 // delay
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
138 case 0xff:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
139 delay = 1 + (u8) (data - 1);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
140 break;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
141
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
142 // play command & data
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
143 default:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
144 opl->write (cmnd, data);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
145
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
146 } // command switch
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
147 } // play pass
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
148
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
149
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
150 // count delays
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
151 if (delay)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
152 delay--;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
153
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
154 // advance player position
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
155 play_pos++;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
156 return true;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
157 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
158
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
159
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
160 void
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
161 CmscPlayer::rewind (int subsong)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
162 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
163 // reset state
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
164 dec_prefix = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
165 block_num = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
166 block_pos = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
167 play_pos = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
168 raw_pos = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
169 delay = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
170
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
171 // init the OPL chip and go to OPL2 mode
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
172 opl->init ();
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
173 opl->write (1, 32);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
174 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
175
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
176
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
177 float
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
178 CmscPlayer::getrefresh ()
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
179 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
180 // PC timer oscillator frequency / wait register
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
181 return 1193180 / (float) (timer_div ? timer_div : 0xffff);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
182 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
183
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
184 std::string
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
185 CmscPlayer::gettype ()
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
186 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
187 char vstr [40];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
188
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
189 snprintf (vstr, sizeof (vstr), "AdLib MSCplay (version %d)", version);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
190 return std::string (vstr);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
191 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
192
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
193
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
194 /*** private methods *************************************/
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
195
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
196 bool
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
197 CmscPlayer::load_header (binistream * bf, msc_header * hdr)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
198 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
199 // check signature
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
200 bf->readString ((char *) hdr->mh_sign, sizeof (hdr->mh_sign));
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
201 if (memcmp (msc_signature, hdr->mh_sign, MSC_SIGN_LEN) != 0)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
202 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
203
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
204 // check version
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
205 hdr->mh_ver = bf->readInt (2);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
206 if (hdr->mh_ver != 0)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
207 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
208
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
209 bf->readString ((char *) hdr->mh_desc, sizeof (hdr->mh_desc));
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
210 hdr->mh_timer = bf->readInt (2);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
211 hdr->mh_nr_blocks = bf->readInt (2);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
212 hdr->mh_block_len = bf->readInt (2);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
213 return true;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
214 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
215
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
216
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
217 bool
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
218 CmscPlayer::decode_octet (u8 * output)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
219 {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
220 msc_block blk; // compressed data block
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
221
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
222 if (block_num >= nr_blocks)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
223 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
224
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
225 blk = msc_data [block_num];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
226 while (1) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
227 u8 octet; // decoded octet
637
2b06eb5e472d [svn] Sync with upstream. Drop hardware OPL2/3 support, it throws warnings and is not used on most modern machines. Added var inits where GCC 4.0 thought it was a good idea.
chainsaw
parents: 428
diff changeset
228 u8 len_corr = 0; // length correction
428
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
229
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
230 // advance to next block if necessary
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
231 if (block_pos >= blk.mb_length && dec_len == 0) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
232 block_num++;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
233 if (block_num >= nr_blocks)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
234 return false;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
235
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
236 blk = msc_data [block_num];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
237 block_pos = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
238 raw_pos = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
239 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
240
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
241 // decode the compressed music data
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
242 switch (dec_prefix) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
243
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
244 // decode prefix
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
245 case 155:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
246 case 175:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
247 octet = blk.mb_data [block_pos++];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
248 if (octet == 0) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
249 // invalid prefix, output original
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
250 octet = dec_prefix;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
251 dec_prefix = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
252 break;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
253 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
254
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
255 // isolate length and distance
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
256 dec_len = (octet & 0x0F);
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
257 len_corr = 2;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
258
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
259 dec_dist = (octet & 0xF0) >> 4;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
260 if (dec_prefix == 155)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
261 dec_dist++;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
262
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
263 // next decode step for respective prefix type
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
264 dec_prefix++;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
265 continue;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
266
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
267
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
268 // check for extended length
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
269 case 156:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
270 if (dec_len == 15)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
271 dec_len += blk.mb_data [block_pos++];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
272
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
273 // add length correction and go for copy mode
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
274 dec_len += len_corr;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
275 dec_prefix = 255;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
276 continue;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
277
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
278
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
279 // get extended distance
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
280 case 176:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
281 dec_dist += 17 + 16 * blk.mb_data [block_pos++];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
282 len_corr = 3;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
283
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
284 // check for extended length
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
285 dec_prefix = 156;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
286 continue;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
287
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
288
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
289 // prefix copy mode
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
290 case 255:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
291 octet = raw_data [raw_pos - dec_dist];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
292
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
293 dec_len--;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
294 if (dec_len == 0) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
295 // back to normal mode
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
296 dec_prefix = 0;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
297 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
298
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
299 break;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
300
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
301
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
302 // normal mode
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
303 default:
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
304 octet = blk.mb_data [block_pos++];
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
305 if (octet == 155 || octet == 175) {
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
306 // it's a prefix, restart
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
307 dec_prefix = octet;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
308 continue;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
309 }
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
310 } // prefix switch
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
311
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
312
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
313 // output the octet
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
314 if (output != NULL)
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
315 *output = octet;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
316
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
317 raw_data [raw_pos++] = octet;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
318 break;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
319 }; // decode pass
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
320
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
321 return true;
15ca2ea93a30 [svn] Sync with upstream CVS. This implements RIX playback.
chainsaw
parents:
diff changeset
322 }