Mercurial > hg > svcore
comparison data/fileio/WavFileWriter.cpp @ 1348:b3cb0edc25cd 3.0-integration
Update WAV/MP3/BZipFileDevice code to avoid using local 8-bit encoding
author | Chris Cannam |
---|---|
date | Fri, 06 Jan 2017 16:40:11 +0000 |
parents | 54af1e21705c |
children | 1bc6f70cb4c7 |
comparison
equal
deleted
inserted
replaced
1347:281a8c9d4886 | 1348:b3cb0edc25cd |
---|---|
33 FileWriteMode mode) : | 33 FileWriteMode mode) : |
34 m_path(path), | 34 m_path(path), |
35 m_sampleRate(sampleRate), | 35 m_sampleRate(sampleRate), |
36 m_channels(channels), | 36 m_channels(channels), |
37 m_temp(0), | 37 m_temp(0), |
38 m_file(0) | 38 m_sndfile(0), |
39 m_qfile(0) | |
39 { | 40 { |
40 SF_INFO fileInfo; | 41 SF_INFO fileInfo; |
41 | 42 |
42 int fileRate = int(round(m_sampleRate)); | 43 int fileRate = int(round(m_sampleRate)); |
43 if (m_sampleRate != sv_samplerate_t(fileRate)) { | 44 if (m_sampleRate != sv_samplerate_t(fileRate)) { |
44 cerr << "WavFileWriter: WARNING: Non-integer sample rate " | 45 SVCERR << "WavFileWriter: WARNING: Non-integer sample rate " |
45 << m_sampleRate << " presented, rounding to " << fileRate | 46 << m_sampleRate << " presented, rounding to " << fileRate |
46 << endl; | 47 << endl; |
47 } | 48 } |
48 fileInfo.samplerate = fileRate; | 49 fileInfo.samplerate = fileRate; |
49 fileInfo.channels = m_channels; | 50 fileInfo.channels = m_channels; |
50 fileInfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; | 51 fileInfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; |
51 | 52 |
52 try { | 53 try { |
53 if (mode == WriteToTemporary) { | 54 if (mode == WriteToTemporary) { |
54 m_temp = new TempWriteFile(m_path); | 55 m_temp = new TempWriteFile(m_path); |
55 m_file = sf_open(m_temp->getTemporaryFilename().toLocal8Bit(), | 56 m_qfile = new QFile(m_temp->getTemporaryFilename()); |
56 SFM_WRITE, &fileInfo); | 57 } else { |
57 if (!m_file) { | 58 m_qfile = new QFile(m_path); |
58 cerr << "WavFileWriter: Failed to open file (" | 59 } |
59 << sf_strerror(m_file) << ")" << endl; | 60 if (!m_qfile->open(QIODevice::WriteOnly)) { |
61 SVCERR << "WavFileWriter: Failed to open file for writing" << endl; | |
62 m_error = QString("Failed to open audio file '%1' for writing") | |
63 .arg(m_qfile->fileName()); | |
64 } else { | |
65 m_sndfile = sf_open_fd(m_qfile->handle(), | |
66 SFM_WRITE, &fileInfo, false); | |
67 if (!m_sndfile) { | |
68 SVCERR << "WavFileWriter: Failed to open file (" | |
69 << sf_strerror(m_sndfile) << ")" << endl; | |
60 m_error = QString("Failed to open audio file '%1' for writing") | 70 m_error = QString("Failed to open audio file '%1' for writing") |
61 .arg(m_temp->getTemporaryFilename()); | 71 .arg(m_qfile->fileName()); |
62 } | 72 } |
63 } else { | 73 } |
64 m_file = sf_open(m_path.toLocal8Bit(), SFM_WRITE, &fileInfo); | |
65 if (!m_file) { | |
66 cerr << "WavFileWriter: Failed to open file (" | |
67 << sf_strerror(m_file) << ")" << endl; | |
68 m_error = QString("Failed to open audio file '%1' for writing") | |
69 .arg(m_path); | |
70 } | |
71 } | |
72 } catch (FileOperationFailed &f) { | 74 } catch (FileOperationFailed &f) { |
73 m_error = f.what(); | 75 m_error = f.what(); |
74 m_temp = 0; | 76 m_temp = 0; |
75 m_file = 0; | 77 m_qfile = 0; |
78 m_sndfile = 0; | |
76 } | 79 } |
77 } | 80 } |
78 | 81 |
79 WavFileWriter::~WavFileWriter() | 82 WavFileWriter::~WavFileWriter() |
80 { | 83 { |
81 if (m_file) close(); | 84 if (m_sndfile) close(); |
82 } | 85 } |
83 | 86 |
84 bool | 87 bool |
85 WavFileWriter::isOK() const | 88 WavFileWriter::isOK() const |
86 { | 89 { |
114 m_error = QString("Failed to write model to audio file '%1'") | 117 m_error = QString("Failed to write model to audio file '%1'") |
115 .arg(getWriteFilename()); | 118 .arg(getWriteFilename()); |
116 return false; | 119 return false; |
117 } | 120 } |
118 | 121 |
119 if (!m_file) { | 122 if (!m_sndfile) { |
120 m_error = QString("Failed to write model to audio file '%1': File not open") | 123 m_error = QString("Failed to write model to audio file '%1': File not open") |
121 .arg(getWriteFilename()); | 124 .arg(getWriteFilename()); |
122 return false; | 125 return false; |
123 } | 126 } |
124 | 127 |
148 for (int i = 0; in_range_for(chanbuf, i); ++i) { | 151 for (int i = 0; in_range_for(chanbuf, i); ++i) { |
149 interleaved[i * m_channels + c] = chanbuf[i]; | 152 interleaved[i * m_channels + c] = chanbuf[i]; |
150 } | 153 } |
151 } | 154 } |
152 | 155 |
153 sf_count_t written = sf_writef_float(m_file, interleaved.data(), n); | 156 sf_count_t written = sf_writef_float(m_sndfile, interleaved.data(), n); |
154 | 157 |
155 if (written < n) { | 158 if (written < n) { |
156 m_error = QString("Only wrote %1 of %2 frames at file frame %3") | 159 m_error = QString("Only wrote %1 of %2 frames at file frame %3") |
157 .arg(written).arg(n).arg(f); | 160 .arg(written).arg(n).arg(f); |
158 break; | 161 break; |
166 } | 169 } |
167 | 170 |
168 bool | 171 bool |
169 WavFileWriter::writeSamples(const float *const *samples, sv_frame_t count) | 172 WavFileWriter::writeSamples(const float *const *samples, sv_frame_t count) |
170 { | 173 { |
171 if (!m_file) { | 174 if (!m_sndfile) { |
172 m_error = QString("Failed to write model to audio file '%1': File not open") | 175 m_error = QString("Failed to write model to audio file '%1': File not open") |
173 .arg(getWriteFilename()); | 176 .arg(getWriteFilename()); |
174 return false; | 177 return false; |
175 } | 178 } |
176 | 179 |
179 for (int c = 0; c < int(m_channels); ++c) { | 182 for (int c = 0; c < int(m_channels); ++c) { |
180 b[i * m_channels + c] = samples[c][i]; | 183 b[i * m_channels + c] = samples[c][i]; |
181 } | 184 } |
182 } | 185 } |
183 | 186 |
184 sv_frame_t written = sf_writef_float(m_file, b, count); | 187 sv_frame_t written = sf_writef_float(m_sndfile, b, count); |
185 | 188 |
186 delete[] b; | 189 delete[] b; |
187 | 190 |
188 if (written < count) { | 191 if (written < count) { |
189 m_error = QString("Only wrote %1 of %2 frames") | 192 m_error = QString("Only wrote %1 of %2 frames") |
194 } | 197 } |
195 | 198 |
196 bool | 199 bool |
197 WavFileWriter::close() | 200 WavFileWriter::close() |
198 { | 201 { |
199 if (m_file) { | 202 if (m_sndfile) { |
200 sf_close(m_file); | 203 sf_close(m_sndfile); |
201 m_file = 0; | 204 m_sndfile = 0; |
202 } | 205 } |
206 | |
207 delete m_qfile; | |
208 m_qfile = 0; | |
209 | |
203 if (m_temp) { | 210 if (m_temp) { |
204 m_temp->moveToTarget(); | 211 m_temp->moveToTarget(); |
205 delete m_temp; | 212 delete m_temp; |
206 m_temp = 0; | 213 m_temp = 0; |
207 } | 214 } |
215 | |
208 return true; | 216 return true; |
209 } | 217 } |
210 | 218 |