]> git.saurik.com Git - wxWidgets.git/blame - utils/wxMMedia/sndfrmt.cpp
Added CodeWarrior files to distribution scripts
[wxWidgets.git] / utils / wxMMedia / sndfrmt.cpp
CommitLineData
2a040d3f
GL
1////////////////////////////////////////////////////////////////////////////////
2// Name: sndfrmt.cpp
3// Purpose: wxMMedia
4// Author: Guilhem Lavaux
5// Created: 1998
6// Updated: December 1998
7// Copyright: (C) 1997, 1998, Guilhem Lavaux
8// License: wxWindows license
9////////////////////////////////////////////////////////////////////////////////
4d6306eb
GL
10#ifdef __GNUG__
11#pragma implementation "sndfrmt.h"
12#endif
13#include "sndsnd.h"
14#include "sndfrmt.h"
15#include "sndpcm.h"
4d6306eb
GL
16
17// ----------------------------------------------------------------------------
18// wxSoundDataFormat
19// ----------------------------------------------------------------------------
20
21wxSoundDataFormat::wxSoundDataFormat()
22{
23 m_srate = 22050;
24 m_bps = 8;
25 m_channels = 1;
26 m_codno = 1;
27 m_codec = NULL;
28 m_codchange = FALSE;
29 m_codcreate = TRUE;
30}
31
926c550d
GL
32wxSoundDataFormat::wxSoundDataFormat(const wxSoundDataFormat& format)
33{
34 m_srate = format.m_srate;
35 m_bps = format.m_bps;
36 m_channels = format.m_channels;
37 m_codno = format.m_codno;
38 m_sign = format.m_sign;
39 m_byteorder = format.m_byteorder;
40 m_codchange = FALSE;
41 m_codcreate = TRUE;
42 m_codec = NULL;
43}
44
4d6306eb
GL
45wxSoundDataFormat::~wxSoundDataFormat()
46{
47 wxDELETE(m_codec);
48}
49
50void wxSoundDataFormat::SetChannels(int channels)
51{
52 m_channels = channels;
53}
54
55void wxSoundDataFormat::SetBps(int bps)
56{
57 m_bps = bps;
58 CodecChange();
59}
60
61void wxSoundDataFormat::SetSign(int sign)
62{
63 m_sign = sign;
64 CodecChange();
65}
66
67void wxSoundDataFormat::SetByteOrder(int byteorder)
68{
69 m_byteorder = byteorder;
70 CodecChange();
71}
72
73void wxSoundDataFormat::SetCodecNo(int codno)
74{
75 m_codno = codno;
76 m_codchange = TRUE;
77 CodecChange();
78}
79
80wxSoundCodec *wxSoundDataFormat::GetCodec()
81{
82 if (!m_codcreate)
83 return NULL;
84
85 if (m_codchange)
926c550d 86 wxDELETE(m_codec);
4d6306eb
GL
87
88 if (m_codec)
89 return m_codec;
90
91 m_codchange = FALSE;
92 m_codec = wxSoundCodec::Get(m_codno);
2a040d3f 93 CodecChange();
4d6306eb
GL
94
95 return m_codec;
96}
97
98void wxSoundDataFormat::CodecChange()
99{
100 wxSoundCodec *codec = GetCodec();
101
102 if (!codec)
103 return;
104
105 switch (m_codno) {
106 case WXSOUND_PCM: {
107 wxSoundPcmCodec *pcm_codec = (wxSoundPcmCodec *)codec;
108
109 pcm_codec->SetBits(m_bps);
110 pcm_codec->SetByteOrder(m_byteorder);
111 pcm_codec->SetSign(m_sign);
112 break;
113 }
114 default:
115 break;
116 }
117}
118
119wxSoundDataFormat& wxSoundDataFormat::operator =(const wxSoundDataFormat& format)
120{
121 wxDELETE(m_codec);
122
123 m_srate = format.m_srate;
124 m_bps = format.m_bps;
125 m_channels = format.m_channels;
126 m_codno = format.m_codno;
127 m_sign = format.m_sign;
128 m_byteorder = format.m_byteorder;
129
130 return *this;
131}
132
133bool wxSoundDataFormat::operator ==(const wxSoundDataFormat& format) const
134{
135 if (m_codno != format.m_codno || m_srate != format.m_srate ||
136 m_bps != format.m_bps || m_channels != format.m_channels)
137 return FALSE;
138
139 if (m_codno == WXSOUND_PCM &&
140 (m_sign != format.m_sign || m_byteorder != format.m_byteorder))
141 return FALSE;
142
143 return TRUE;
144}
145
146// ----------------------------------------------------------------------------
147// wxSoundCodec
148// ----------------------------------------------------------------------------
149
150#include "sndpcm.h"
151//#include "sndadpcm.h"
152//#include "sndalaw.h"
153#include "sndmulaw.h"
154
155static wxClassInfo *l_sound_formats[] = {
156 NULL,
157 CLASSINFO(wxSoundPcmCodec),
158 NULL, // CLASSINFO(wxSoundAdpcmCodec),
159 NULL,
160 NULL,
161 NULL,
162 NULL, // CLASSINFO(wxSoundAlawCodec),
163 NULL // CLASSINFO(wxSoundMulawCodec)
164};
165
166static int l_nb_formats = WXSIZEOF(l_sound_formats);
167
168wxSoundCodec::wxSoundCodec()
169{
170 m_in_sound = NULL;
171 m_out_sound = NULL;
172 m_init = TRUE;
926c550d 173 m_chain_codec = NULL;
4d6306eb
GL
174}
175
176wxSoundCodec::~wxSoundCodec()
177{
eb4e516d
GL
178 if (m_mode != WAITING)
179 ExitMode();
4d6306eb
GL
180}
181
182void wxSoundCodec::InitIO(const wxSoundDataFormat& format)
183{
184 m_io_format = format;
185}
186
eb4e516d 187void wxSoundCodec::InitMode(ModeType mode)
4d6306eb
GL
188{
189 wxStreamBuffer *buf_snd;
190
eb4e516d 191 m_mode = mode;
4d6306eb 192 if (!m_chain_codec) {
eb4e516d 193 if (m_mode == ENCODING) {
4d6306eb
GL
194 m_out_sound = new wxStreamBuffer(*this, wxStreamBuffer::write);
195 m_out_sound->SetBufferIO(1024);
196 } else {
197 m_in_sound = new wxStreamBuffer(*this, wxStreamBuffer::read);
198 m_in_sound->SetBufferIO(1024);
199 }
200 }
201 if (m_chain_codec) {
202 if (m_chain_before) {
203 m_chain_codec->SetInStream(m_in_sound);
204 buf_snd = new wxStreamBuffer(wxStreamBuffer::read_write);
205 buf_snd->Fixed(FALSE);
206 m_chain_codec->SetOutStream(buf_snd);
207 m_chain_codec->Decode();
208 buf_snd->Seek(0, wxFromStart);
209 m_in_sound = buf_snd;
210 } else {
211 buf_snd = new wxStreamBuffer(wxStreamBuffer::read_write);
212 buf_snd->Fixed(FALSE);
213
214 m_chain_codec->SetInStream(buf_snd);
215 m_chain_codec->SetOutStream(m_out_sound);
216 m_out_sound = buf_snd;
217
218 buf_snd->Seek(0, wxFromStart);
219 }
220 }
221}
222
223void wxSoundCodec::ExitMode()
224{
225 if (m_chain_codec) {
226 if (m_chain_before) {
227 delete m_in_sound;
228 m_in_sound = m_chain_codec->GetInStream();
229 } else {
230 delete m_out_sound;
231 m_out_sound = m_chain_codec->GetOutStream();
232 }
233 }
eb4e516d 234 m_mode = WAITING;
4d6306eb
GL
235}
236
237bool wxSoundCodec::ChainCodecBefore(wxSoundDataFormat& format)
238{
239 m_chain_codec = format.GetCodec();
240
241 if (!m_chain_codec)
242 return FALSE;
243
244 m_chain_before = TRUE;
245 return TRUE;
246}
247
248bool wxSoundCodec::ChainCodecAfter(wxSoundDataFormat& format)
249{
250 m_chain_codec = format.GetCodec();
251
252 if (!m_chain_codec)
253 return FALSE;
254
255 m_chain_before = FALSE;
256 return TRUE;
257}
258
259void wxSoundCodec::CopyToOutput()
260{
261 m_out_sound->Write(m_in_sound);
262}
263
264size_t wxSoundCodec::Available()
265{
266 return m_io_sndbuf->Available();
267}
268
269size_t wxSoundCodec::OnSysRead(void *buffer, size_t bsize)
270{
271 wxUint32 s = bsize;
272 m_io_sndbuf->OnNeedOutputData((char *)buffer, s);
273 return bsize;
274}
275
276size_t wxSoundCodec::OnSysWrite(const void *buffer, size_t bsize)
277{
278 wxUint32 s = bsize;
279 m_io_sndbuf->OnBufferInFinished((char *)buffer, s);
280 return bsize;
281}
282
283wxSoundCodec *wxSoundCodec::Get(int no)
284{
285 if (no < 0 || no >= l_nb_formats)
286 return NULL;
287
288 if (!l_sound_formats[no])
289 return NULL;
290
291 return (wxSoundCodec *)l_sound_formats[no]->CreateObject();
292}