]> git.saurik.com Git - wxWidgets.git/blame_incremental - utils/wxMMedia/sndpcm.cpp
Added more makefiles
[wxWidgets.git] / utils / wxMMedia / sndpcm.cpp
... / ...
CommitLineData
1#ifdef __GNUG__
2#pragma implementation "sndpcm.h"
3#endif
4#include "sndsnd.h"
5#include "sndpcm.h"
6
7#define WX_BIG_ENDIAN 0
8
9wxSoundPcmCodec::wxSoundPcmCodec()
10 : wxSoundCodec()
11{
12 m_orig_format.SetCodecCreate(FALSE);
13 m_orig_format.SetCodecNo(WXSOUND_PCM);
14}
15
16wxSoundPcmCodec::~wxSoundPcmCodec()
17{
18}
19
20size_t wxSoundPcmCodec::GetByteRate() const
21{
22 return (m_orig_format.GetBps()/8)*
23 m_orig_format.GetSampleRate()*
24 m_orig_format.GetChannels();
25}
26
27wxSoundDataFormat wxSoundPcmCodec::GetPreferredFormat(int codec) const
28{
29 wxSoundDataFormat prefFormat;
30
31 prefFormat = m_orig_format;
32 return prefFormat;
33}
34
35// ---------------------------------------------------------------------------
36// Main part of the decoder
37// ---------------------------------------------------------------------------
38
39void wxSoundPcmCodec::Decode()
40{
41 if (m_io_format == m_orig_format) {
42 CopyToOutput();
43 return;
44 }
45
46 // Swap bytes
47 switch (m_io_format.GetBps()) {
48 case 8:
49 InputSign8();
50 break;
51 case 16:
52 InputSwapAndSign16();
53 break;
54 case 32:
55 case 64:
56 default:
57 break;
58 }
59}
60
61// ---------------------------------------------------------------------------
62// Change the sign of a 8-bit sample.
63
64#define GET() (m_in_sound->GetChar())
65#define PUT(c) (m_out_sound->PutChar(c))
66
67void wxSoundPcmCodec::InputSign8()
68{
69 unsigned char signer = 0;
70
71 if (m_io_format.GetSign() != m_orig_format.GetSign())
72 signer = 128;
73
74 while (StreamOk())
75 PUT(GET() + signer);
76}
77
78// ---------------------------------------------------------------------------
79// Swap bytes and change the sign of a 16-bit sample.
80
81void wxSoundPcmCodec::InputSwapAndSign16()
82{
83 unsigned short signer1 = 0, signer2 = 0;
84 bool swap = (m_io_format.GetByteOrder() != m_orig_format.GetByteOrder());
85 register char temp, temp2;
86
87 if (m_io_format.GetSign() != m_orig_format.GetSign()) {
88 if (m_io_format.GetByteOrder() == wxSND_SAMPLE_LE)
89 signer2 = 0x80;
90 else
91 signer1 = 0x80;
92 }
93
94 if (swap) {
95 while (StreamOk()) {
96 temp = GET();
97 temp2 = GET();
98 PUT(temp2 ^ signer2);
99 if (!StreamOk()) {
100 m_in_sound->WriteBack(temp);
101 m_in_sound->WriteBack(temp2);
102 break;
103 }
104 PUT(temp ^ signer1);
105 }
106 } else {
107 while (StreamOk()) {
108 temp = GET();
109 PUT(temp ^ signer1);
110 if (!StreamOk()) {
111 m_in_sound->WriteBack(temp);
112 break;
113 }
114 PUT(GET() ^ signer2);
115 }
116 }
117}
118
119// ---------------------------------------------------------------------------
120// Encoder part.
121// ---------------------------------------------------------------------------
122
123void wxSoundPcmCodec::OutputSign8()
124{
125 unsigned char signer = 0;
126
127 if (m_io_format.GetSign() != m_orig_format.GetSign())
128 signer = 128;
129
130 while (StreamOk())
131 PUT((char)(GET() + signer));
132}
133
134// ---------------------------------------------------------------------------
135
136void wxSoundPcmCodec::OutputSwapAndSign16()
137{
138 bool swap = (m_io_format.GetByteOrder() != m_orig_format.GetByteOrder());
139 unsigned short signer1 = 0, signer2 = 0;
140 register char temp, temp2;
141
142 if (m_io_format.GetSign() != m_orig_format.GetSign())
143 if (m_io_format.GetByteOrder() == wxSND_SAMPLE_LE)
144 signer1 = 0x80;
145 else
146 signer2 = 0x80;
147
148 if (swap) {
149 while (StreamOk()) {
150 temp = GET();
151 temp2 = GET();
152 PUT(temp2 ^ signer1);
153 if (!StreamOk()) {
154 m_in_sound->WriteBack(temp);
155 m_in_sound->WriteBack(temp2);
156 break;
157 }
158 PUT(temp ^ signer2);
159 }
160 } else {
161 while (StreamOk()) {
162 temp = GET();
163 temp2 = GET();
164 PUT(temp ^ signer1);
165 if (!StreamOk()) {
166 m_in_sound->WriteBack(temp);
167 break;
168 }
169 PUT(temp2 ^ signer2);
170 }
171 }
172
173}
174
175// ---------------------------------------------------------------------------
176
177void wxSoundPcmCodec::Encode()
178{
179 if (m_io_format == m_orig_format) {
180 CopyToOutput();
181 return;
182 }
183
184 // Swap bytes
185 switch (m_io_format.GetBps()) {
186 case 8:
187 OutputSign8();
188 break;
189 case 16:
190 OutputSwapAndSign16();
191 break;
192 case 32:
193 case 64:
194 default:
195 break;
196 }
197}