]> git.saurik.com Git - wxWidgets.git/blob - utils/wxMMedia2/lib/sndaiff.cpp
Removed unnecessary code from utilsunx.cpp
[wxWidgets.git] / utils / wxMMedia2 / lib / sndaiff.cpp
1 // --------------------------------------------------------------------------
2 // Name: sndaiff.cpp
3 // Purpose:
4 // Date: 08/11/1999
5 // Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
6 // CVSID: $Id$
7 // --------------------------------------------------------------------------
8 #ifdef __GNUG__
9 #pragma implementation "sndaiff.cpp"
10 #endif
11
12 #include <wx/wxprec.h>
13
14 #include <wx/stream.h>
15 #include <wx/datstrm.h>
16 #include <wx/filefn.h>
17 #include "sndbase.h"
18 #include "sndcodec.h"
19 #include "sndfile.h"
20 #include "sndpcm.h"
21 #include "sndaiff.h"
22
23 #define BUILD_SIGNATURE(a,b,c,d) (((wxUint32)a) | (((wxUint32)b) << 8) | (((wxUint32)c) << 16) | (((wxUint32)d) << 24))
24
25 #define FORM_SIGNATURE BUILD_SIGNATURE('F','O','R','M')
26 #define AIFF_SIGNATURE BUILD_SIGNATURE('A','I','F','F')
27 #define AIFC_SIGNATURE BUILD_SIGNATURE('A','I','F','C')
28 #define COMM_SIGNATURE BUILD_SIGNATURE('C','O','M','M')
29 #define SSND_SIGNATURE BUILD_SIGNATURE('S','S','N','D')
30
31 wxSoundAiff::wxSoundAiff(wxInputStream& stream, wxSoundStream& io_sound)
32 : wxSoundFileStream(stream, io_sound)
33 {
34 m_base_offset = wxInvalidOffset;
35 }
36
37 wxSoundAiff::wxSoundAiff(wxOutputStream& stream, wxSoundStream& io_sound)
38 : wxSoundFileStream(stream, io_sound)
39 {
40 m_base_offset = wxInvalidOffset;
41 }
42
43 wxSoundAiff::~wxSoundAiff()
44 {
45 }
46
47 wxString wxSoundAiff::GetCodecName() const
48 {
49 return "wxSoundAiff codec";
50 }
51
52 bool wxSoundAiff::CanRead()
53 {
54 wxUint32 signature1, signature2, len;
55
56 if (m_input->Read(&signature1, 4).LastRead() != 4)
57 return FALSE;
58
59 if (wxUINT32_SWAP_ON_BE(signature1) != FORM_SIGNATURE) {
60 m_input->Ungetch(&signature1, 4);
61 return FALSE;
62 }
63
64 m_input->Read(&len, 4);
65 if (m_input->LastRead() != 4) {
66 m_input->Ungetch(&len, m_input->LastRead());
67 m_input->Ungetch(&signature1, 4);
68 return FALSE;
69 }
70
71 if (m_input->Read(&signature2, 4).LastRead() != 4) {
72 m_input->Ungetch(&signature2, m_input->LastRead());
73 m_input->Ungetch(&len, 4);
74 m_input->Ungetch(&signature1, 4);
75 return FALSE;
76 }
77
78 m_input->Ungetch(&signature2, 4);
79 m_input->Ungetch(&len, 4);
80 m_input->Ungetch(&signature1, 4);
81
82 if (
83 wxUINT32_SWAP_ON_BE(signature2) != AIFF_SIGNATURE &&
84 wxUINT32_SWAP_ON_BE(signature2) != AIFC_SIGNATURE)
85 return FALSE;
86
87 return TRUE;
88 }
89
90 #define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return FALSE; }
91
92 bool wxSoundAiff::PrepareToPlay()
93 {
94 wxDataInputStream data(*m_input);
95 wxUint32 signature, len, ssnd;
96 bool end_headers;
97
98 if (!m_input) {
99 m_snderror = wxSOUND_INVSTRM;
100 return FALSE;
101 }
102
103 data.BigEndianOrdered(TRUE);
104
105 FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
106 FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != FORM_SIGNATURE, wxSOUND_INVSTRM);
107 // "FORM"
108
109 len = data.Read32();
110 FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
111 // dummy len
112
113 FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
114 FAIL_WITH(
115 wxUINT32_SWAP_ON_BE(signature) != AIFF_SIGNATURE &&
116 wxUINT32_SWAP_ON_BE(signature) != AIFC_SIGNATURE, wxSOUND_INVSTRM);
117 // "AIFF" / "AIFC"
118
119 end_headers = FALSE;
120 while (!end_headers) {
121 FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
122
123 len = data.Read32();
124 FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
125
126 switch (wxUINT32_SWAP_ON_BE(signature)) {
127 case COMM_SIGNATURE: { // "COMM"
128 wxUint16 channels, bps;
129 wxUint32 num_samples;
130 double srate;
131 wxSoundFormatPcm sndformat;
132
133 data >> channels >> num_samples >> bps >> srate;
134
135 sndformat.SetSampleRate((wxUint32) srate);
136 sndformat.SetBPS(bps);
137 sndformat.SetChannels(channels);
138 sndformat.Signed(FALSE);
139 sndformat.SetOrder(wxBIG_ENDIAN);
140
141 if (!SetSoundFormat(sndformat))
142 return FALSE;
143 m_input->SeekI(len-18, wxFromCurrent);
144 break;
145 }
146 case SSND_SIGNATURE: { // "SSND"
147 data >> ssnd;
148 // m_input->SeekI(4, wxFromCurrent); // Pass an INT32
149 // m_input->SeekI(len-4, wxFromCurrent); // Pass the rest
150 m_input->SeekI(ssnd + 4, wxFromCurrent);
151 m_base_offset = m_input->TellI();
152 FinishPreparation(len - 8);
153 end_headers = TRUE;
154 break;
155 }
156 default:
157 m_input->SeekI(len, wxFromCurrent);
158 break;
159 }
160 }
161 return TRUE;
162 }
163
164 bool wxSoundAiff::PrepareToRecord(wxUint32 time)
165 {
166 // TODO
167 return FALSE;
168 }
169
170 bool wxSoundAiff::FinishRecording()
171 {
172 // TODO
173 return FALSE;
174 }
175
176 bool wxSoundAiff::RepositionStream(wxUint32 position)
177 {
178 if (m_base_offset == wxInvalidOffset)
179 return FALSE;
180 m_input->SeekI(m_base_offset, wxFromStart);
181 return TRUE;
182 }
183
184 wxUint32 wxSoundAiff::GetData(void *buffer, wxUint32 len)
185 {
186 return m_input->Read(buffer, len).LastRead();
187 }
188
189 wxUint32 wxSoundAiff::PutData(const void *buffer, wxUint32 len)
190 {
191 return m_output->Write(buffer, len).LastWrite();
192 }