]> git.saurik.com Git - wxWidgets.git/blob - utils/wxMMedia/mmriff.cpp
* Fixes
[wxWidgets.git] / utils / wxMMedia / mmriff.cpp
1 ////////////////////////////////////////////////////////////////////////////////
2 // Name: mmriff.cpp
3 // Purpose: wxMMedia
4 // Author: Guilhem Lavaux
5 // Created: 1997
6 // Updated: 1998
7 // Copyright: (C) 1997, 1998, Guilhem Lavaux
8 // License: wxWindows license
9 ////////////////////////////////////////////////////////////////////////////////
10 #ifdef __GNUG__
11 #pragma implementation "mmriff.h"
12 #endif
13
14 #ifdef WX_PRECOMP
15 #include "wx_prec.h"
16 #else
17 #include "wx/wx.h"
18 #endif
19 #include "mmfile.h"
20 #include "mmriff.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 wxRiffCodec::wxRiffCodec() :
27 riff_i_stream(NULL), riff_o_stream(NULL), chunk_length(INVALID_CHUNK_LEN)
28 {
29 }
30
31 wxRiffCodec::wxRiffCodec(wxInputStream& s) :
32 riff_i_stream(&s), riff_o_stream(NULL), chunk_length(INVALID_CHUNK_LEN)
33 {
34 }
35
36 wxRiffCodec::wxRiffCodec(wxOutputStream& s) :
37 riff_i_stream(NULL), riff_o_stream(&s), chunk_length(INVALID_CHUNK_LEN)
38 {
39 }
40
41 wxRiffCodec::~wxRiffCodec()
42 {
43 }
44
45 bool wxRiffCodec::RiffReset(wxUint8 mode)
46 {
47 switch (mode) {
48 case RIFF_READ:
49 if (!riff_i_stream)
50 return FALSE;
51 riff_i_stream->SeekI(0);
52 chunk_length = INVALID_CHUNK_LEN;
53 return TRUE;
54 case RIFF_WRITE:
55 if (!riff_o_stream)
56 return FALSE;
57 riff_o_stream->SeekO(0);
58 chunk_length = INVALID_CHUNK_LEN;
59 return TRUE;
60 }
61 return FALSE;
62 }
63
64 bool wxRiffCodec::ReadData(void *data, wxUint32 size)
65 {
66 if (!riff_i_stream)
67 return FALSE;
68
69 if (chunk_length != INVALID_CHUNK_LEN && (wxUint32)chunk_length < size) {
70 riff_error = wxMMFILE_EOF;
71 return FALSE;
72 }
73 if (chunk_length != INVALID_CHUNK_LEN)
74 chunk_length -= size;
75
76 bool ret = (riff_i_stream->Read((char *)data, size).LastRead() == size);
77
78 return ret;
79 }
80
81 bool wxRiffCodec::WriteData(void *data, wxUint32 size)
82 {
83 if (!riff_o_stream)
84 return FALSE;
85
86 if (chunk_length < size) {
87 riff_error = wxMMFILE_EOF;
88 return FALSE;
89 }
90 chunk_length -= size;
91
92 riff_o_stream->Write(data, size);
93
94 return TRUE;
95 }
96
97 bool wxRiffCodec::Read32(wxUint32& i32)
98 {
99 wxUint8 i8[4];
100
101 if (!ReadData(i8, 4))
102 return FALSE;
103
104 i32 = i8[0];
105 i32 |= ((wxUint32)i8[1]) << 8;
106 i32 |= ((wxUint32)i8[2]) << 16;
107 i32 |= ((wxUint32)i8[3]) << 24;
108
109 return TRUE;
110 }
111
112 bool wxRiffCodec::Write32(wxUint32 i32)
113 {
114 wxUint8 i8[4];
115
116 i8[0] = i32 & 0xff;
117 i8[1] = (i32 >> 8) & 0xff;
118 i8[2] = (i32 >> 16) & 0xff;
119 i8[3] = (i32 >> 24) & 0xff;
120
121 if (!WriteData(i8, 4))
122 return FALSE;
123
124 return TRUE;
125 }
126
127 bool wxRiffCodec::Read16(wxUint16& i16)
128 {
129 wxUint8 i8[2];
130
131 if (!ReadData(i8, 2))
132 return FALSE;
133
134 i16 = i8[0];
135 i16 |= ((wxUint16)i8[1]) << 8;
136
137 return TRUE;
138 }
139
140 bool wxRiffCodec::Write16(wxUint16 i16)
141 {
142 wxUint8 i8[2];
143
144 i8[0] = i16 & 0xff;
145 i8[1] = (i16 >> 8) & 0xff;
146
147 if (!WriteData(i8, 2))
148 return FALSE;
149
150 return TRUE;
151 }
152
153 bool wxRiffCodec::Skip(wxUint32 skip)
154 {
155 if (!riff_i_stream || (chunk_length != INVALID_CHUNK_LEN && (wxInt32)skip > chunk_length))
156 return FALSE;
157
158 if (chunk_length != INVALID_CHUNK_LEN)
159 chunk_length -= skip;
160 riff_i_stream->SeekI(skip, wxFromCurrent);
161
162 return TRUE;
163 }
164
165 bool wxRiffCodec::CreateChunk(const wxString& name, wxUint32 size)
166 {
167 if (!riff_o_stream || name.Length() != 4)
168 return FALSE;
169
170 if (riff_o_stream->Write(name.GetData(), 4).LastError()) {
171 riff_error = wxMMFILE_EOF;
172 return FALSE;
173 }
174
175 chunk_length = size+4;
176
177 return Write32(size);
178 }
179
180 bool wxRiffCodec::FindChunk(const wxString& name, bool from_here)
181 {
182 char buf[5];
183 wxString str2;
184
185 if (!riff_i_stream)
186 return FALSE;
187
188 if (chunk_length != INVALID_CHUNK_LEN && !from_here)
189 Skip(chunk_length);
190 while (1) {
191 if (riff_i_stream->Read(buf, 4).LastError()) {
192 riff_error = wxMMFILE_EOF;
193 return FALSE;
194 }
195
196 chunk_length = INVALID_CHUNK_LEN;
197 if (!Read32(chunk_length)) {
198 riff_error = wxMMFILE_EOF;
199 return FALSE;
200 }
201
202 buf[4] = 0;
203 str2 = buf;
204 if ((!name.IsNull()) && str2 != name) {
205 Skip(chunk_length);
206 continue;
207 }
208
209 m_chunk = str2;
210
211 return TRUE;
212 }
213
214 return TRUE;
215 }