OSDN Git Service

Update MediaInfo binaries to v0.7.53 (2012-01-24), compiled with ICL 12.1.6 and MSVC...
[lamexp/LameXP.git] / src / Model_AudioFile.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2012 LoRd_MuldeR <MuldeR2@GMX.de>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License along
16 // with this program; if not, write to the Free Software Foundation, Inc.,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 //
19 // http://www.gnu.org/licenses/gpl-2.0.txt
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include "Model_AudioFile.h"
23
24 #include <QTime>
25 #include <QObject>
26 #include <QMutexLocker>
27 #include <QFile>
28
29 #define U16Str(X) QString::fromUtf16(reinterpret_cast<const unsigned short*>(L##X))
30
31 ////////////////////////////////////////////////////////////
32 // Constructor & Destructor
33 ////////////////////////////////////////////////////////////
34
35 AudioFileModel::AudioFileModel(const QString &path, const QString &name)
36 {
37         resetAll();
38
39         m_filePath = path;
40         m_fileName = name;
41 }
42
43 AudioFileModel::AudioFileModel(const AudioFileModel &model, bool copyMetaInfo)
44 {
45         resetAll();
46
47         setFilePath(model.m_filePath);
48         setFormatContainerType(model.m_formatContainerType);
49         setFormatContainerProfile(model.m_formatContainerProfile);
50         setFormatAudioType(model.m_formatAudioType);
51         setFormatAudioProfile(model.m_formatAudioProfile);
52         setFormatAudioVersion(model.m_formatAudioVersion);
53         setFormatAudioSamplerate(model.m_formatAudioSamplerate);
54         setFormatAudioChannels(model.m_formatAudioChannels);
55         setFormatAudioBitdepth(model.m_formatAudioBitdepth);
56         setFormatAudioBitrate(model.m_formatAudioBitrate);
57         setFormatAudioBitrateMode(model.m_formatAudioBitrateMode);
58         setFileDuration(model.m_fileDuration);
59
60         if(copyMetaInfo)
61         {
62                 setFileName(model.m_fileName);
63                 setFileArtist(model.m_fileArtist);
64                 setFileAlbum(model.m_fileAlbum);
65                 setFileGenre(model.m_fileGenre);
66                 setFileComment(model.m_fileComment);
67                 setFileCover(model.m_fileCover);
68                 setFileYear(model.m_fileYear);
69                 setFilePosition(model.m_filePosition);
70         }
71 }
72
73 AudioFileModel &AudioFileModel::operator=(const AudioFileModel &model)
74 {
75         setFilePath(model.m_filePath);
76         setFileName(model.m_fileName);
77         setFileArtist(model.m_fileArtist);
78         setFileAlbum(model.m_fileAlbum);
79         setFileGenre(model.m_fileGenre);
80         setFileComment(model.m_fileComment);
81         setFileCover(model.m_fileCover);
82         setFileYear(model.m_fileYear);
83         setFilePosition(model.m_filePosition);
84         setFileDuration(model.m_fileDuration);
85
86         setFormatContainerType(model.m_formatContainerType);
87         setFormatContainerProfile(model.m_formatContainerProfile);
88         setFormatAudioType(model.m_formatAudioType);
89         setFormatAudioProfile(model.m_formatAudioProfile);
90         setFormatAudioVersion(model.m_formatAudioVersion);
91         setFormatAudioSamplerate(model.m_formatAudioSamplerate);
92         setFormatAudioChannels(model.m_formatAudioChannels);
93         setFormatAudioBitdepth(model.m_formatAudioBitdepth);
94         setFormatAudioBitrate(model.m_formatAudioBitrate);
95         setFormatAudioBitrateMode(model.m_formatAudioBitrateMode);
96
97         return (*this);
98 }
99
100 AudioFileModel::~AudioFileModel(void)
101 {
102 }
103
104 ////////////////////////////////////////////////////////////
105 // Private Functions
106 ////////////////////////////////////////////////////////////
107
108 void AudioFileModel::resetAll(void)
109 {
110         m_filePath.clear();
111         m_fileName.clear();
112         m_fileArtist.clear();
113         m_fileAlbum.clear();
114         m_fileGenre.clear();
115         m_fileComment.clear();
116         m_fileCover.clear();
117         
118         m_fileYear = 0;
119         m_filePosition = 0;
120         m_fileDuration = 0;
121
122         m_formatContainerType.clear();
123         m_formatContainerProfile.clear();
124         m_formatAudioType.clear();
125         m_formatAudioProfile.clear();
126         m_formatAudioVersion.clear();
127         
128         m_formatAudioSamplerate = 0;
129         m_formatAudioChannels = 0;
130         m_formatAudioBitdepth = 0;
131         m_formatAudioBitrate = 0;
132         m_formatAudioBitrateMode = BitrateModeUndefined;
133 }
134
135 ////////////////////////////////////////////////////////////
136 // Public Functions
137 ////////////////////////////////////////////////////////////
138
139 // ---------------------------------
140 // Getter methods
141 // ---------------------------------
142
143 const QString &AudioFileModel::filePath(void) const
144 {
145         return m_filePath;
146 }
147
148 const QString &AudioFileModel::fileName(void) const
149 {
150         return m_fileName;
151 }
152
153 const QString &AudioFileModel::fileArtist(void) const
154 {
155         return m_fileArtist;
156 }
157
158 const QString &AudioFileModel::fileAlbum(void) const
159 {
160         return m_fileAlbum;
161 }
162
163 const QString &AudioFileModel::fileGenre(void) const
164 {
165         return m_fileGenre;
166 }
167
168 const QString &AudioFileModel::fileComment(void) const
169 {
170         return m_fileComment;
171 }
172
173 const QString &AudioFileModel::fileCover(void) const
174 {
175         return m_fileCover.filePath();
176 }
177
178 unsigned int AudioFileModel::fileYear(void) const
179 {
180         return m_fileYear;
181 }
182
183 unsigned int AudioFileModel::filePosition(void) const
184 {
185         return m_filePosition;
186 }
187
188 unsigned int AudioFileModel::fileDuration(void) const
189 {
190         return m_fileDuration;
191 }
192
193 const QString &AudioFileModel::formatContainerType(void) const
194 {
195         return m_formatContainerType;
196 }
197
198 const QString &AudioFileModel::formatContainerProfile(void) const
199 {
200         return m_formatContainerProfile;
201 }
202
203 const QString &AudioFileModel::formatAudioType(void) const
204 {
205         return m_formatAudioType;
206 }
207
208 const QString &AudioFileModel::formatAudioProfile(void) const
209 {
210         return m_formatAudioProfile;
211 }
212
213 const QString &AudioFileModel::formatAudioVersion(void) const
214 {
215         return m_formatAudioVersion;
216 }
217
218 unsigned int AudioFileModel::formatAudioSamplerate(void) const
219 {
220         return m_formatAudioSamplerate;
221 }
222
223 unsigned int AudioFileModel::formatAudioChannels(void) const
224 {
225         return m_formatAudioChannels;
226 }
227
228 unsigned int AudioFileModel::formatAudioBitdepth(void) const
229 {
230         return m_formatAudioBitdepth;
231 }
232
233 unsigned int AudioFileModel::formatAudioBitrate(void) const
234 {
235         return m_formatAudioBitrate;
236 }
237
238 unsigned int  AudioFileModel::formatAudioBitrateMode(void) const
239 {
240         return m_formatAudioBitrateMode;
241 }
242
243 const QString AudioFileModel::fileDurationInfo(void) const
244 {
245         if(m_fileDuration)
246         {
247                 QTime time = QTime().addSecs(m_fileDuration);
248                 return time.toString("hh:mm:ss");
249         }
250         else
251         {
252                 return QString();
253         }
254 }
255
256 const QString AudioFileModel::formatContainerInfo(void) const
257 {
258         if(!m_formatContainerType.isEmpty())
259         {
260                 QString info = m_formatContainerType;
261                 if(!m_formatContainerProfile.isEmpty()) info.append(QString(" (%1: %2)").arg(tr("Profile"), m_formatContainerProfile));
262                 return info;
263         }
264         else
265         {
266                 return QString();
267         }
268 }
269
270 const QString AudioFileModel::formatAudioBaseInfo(void) const
271 {
272         if(m_formatAudioSamplerate || m_formatAudioChannels || m_formatAudioBitdepth)
273         {
274                 QString info;
275                 if(m_formatAudioChannels)
276                 {
277                         if(!info.isEmpty()) info.append(", ");
278                         info.append(QString("%1: %2").arg(tr("Channels"), QString::number(m_formatAudioChannels)));
279                 }
280                 if(m_formatAudioSamplerate)
281                 {
282                         if(!info.isEmpty()) info.append(", ");
283                         info.append(QString("%1: %2 Hz").arg(tr("Samplerate"), QString::number(m_formatAudioSamplerate)));
284                 }
285                 if(m_formatAudioBitdepth)
286                 {
287                         if(!info.isEmpty()) info.append(", ");
288                         info.append(QString("%1: %2 Bit").arg(tr("Bitdepth"), QString::number(m_formatAudioBitdepth)));
289                 }
290                 return info;
291         }
292         else
293         {
294                 return QString();
295         }
296 }
297
298 const QString AudioFileModel::formatAudioCompressInfo(void) const
299 {
300         if(!m_formatAudioType.isEmpty())
301         {
302                 QString info;
303                 if(!m_formatAudioProfile.isEmpty() || !m_formatAudioVersion.isEmpty())
304                 {
305                         info.append(QString("%1: ").arg(tr("Type")));
306                 }
307                 info.append(m_formatAudioType);
308                 if(!m_formatAudioProfile.isEmpty())
309                 {
310                         info.append(QString(", %1: %2").arg(tr("Profile"), m_formatAudioProfile));
311                 }
312                 if(!m_formatAudioVersion.isEmpty())
313                 {
314                         info.append(QString(", %1: %2").arg(tr("Version"), m_formatAudioVersion));
315                 }
316                 if(m_formatAudioBitrate > 0)
317                 {
318                         switch(m_formatAudioBitrateMode)
319                         {
320                         case BitrateModeConstant:
321                                 info.append(U16Str(", %1: %2 kbps (%3)").arg(tr("Bitrate"), QString::number(m_formatAudioBitrate), tr("Constant")));
322                                 break;
323                         case BitrateModeVariable:
324                                 info.append(U16Str(", %1: \u2248%2 kbps (%3)").arg(tr("Bitrate"), QString::number(m_formatAudioBitrate), tr("Variable")));
325                                 break;
326                         default:
327                                 info.append(U16Str(", %1: %2 kbps").arg(tr("Bitrate"), QString::number(m_formatAudioBitrate)));
328                                 break;
329                         }
330                 }
331                 return info;
332         }
333         else
334         {
335                 return QString();
336         }
337 }
338
339 // ---------------------------------
340 // Setter methods
341 // ---------------------------------
342
343 void AudioFileModel::setFilePath(const QString &path)
344 {
345         m_filePath = path;
346 }
347
348 void AudioFileModel::setFileName(const QString &name)
349 {
350         m_fileName = name;
351 }
352
353 void AudioFileModel::setFileArtist(const QString &artist)
354 {
355         m_fileArtist = artist;
356 }
357
358 void AudioFileModel::setFileAlbum(const QString &album)
359 {
360         m_fileAlbum = album;
361 }
362
363 void AudioFileModel::setFileGenre(const QString &genre)
364 {
365         m_fileGenre = genre;
366 }
367
368 void AudioFileModel::setFileComment(const QString &comment)
369 {
370         m_fileComment = comment;
371 }
372
373 void AudioFileModel::setFileCover(const QString &coverFile, bool owner)
374 {
375         m_fileCover.setFilePath(coverFile, owner);
376 }
377
378 void AudioFileModel::setFileCover(const ArtworkModel &model)
379 {
380         m_fileCover = model;
381 }
382
383 void AudioFileModel::setFileYear(unsigned int year)
384 {
385         m_fileYear = year;
386 }
387
388 void AudioFileModel::setFilePosition(unsigned int position)
389 {
390         m_filePosition = position;
391 }
392
393 void AudioFileModel::setFileDuration(unsigned int duration)
394 {
395         m_fileDuration = duration;
396 }
397
398 void AudioFileModel::setFormatContainerType(const QString &type)
399 {
400         m_formatContainerType = type;
401 }
402
403 void AudioFileModel::setFormatContainerProfile(const QString &profile)
404 {
405         m_formatContainerProfile = profile;
406 }
407
408 void AudioFileModel::setFormatAudioType(const QString &type)
409 {
410         m_formatAudioType = type;
411 }
412
413 void AudioFileModel::setFormatAudioProfile(const QString &profile)
414 {
415         m_formatAudioProfile = profile;
416 }
417
418 void AudioFileModel::setFormatAudioVersion(const QString &version)
419 {
420         m_formatAudioVersion = version;
421 }
422
423 void AudioFileModel::setFormatAudioSamplerate(unsigned int samplerate)
424 {
425         m_formatAudioSamplerate = samplerate;
426 }
427
428 void AudioFileModel::setFormatAudioChannels(unsigned int channels)
429 {
430         m_formatAudioChannels = channels;
431 }
432
433 void AudioFileModel::setFormatAudioBitdepth(unsigned int bitdepth)
434 {
435         m_formatAudioBitdepth = bitdepth;
436 }
437
438 void AudioFileModel::setFormatAudioBitrate(unsigned int bitrate)
439 {
440         m_formatAudioBitrate = bitrate;
441 }
442
443 void AudioFileModel::setFormatAudioBitrateMode(unsigned int bitrateMode)
444 {
445         m_formatAudioBitrateMode = bitrateMode;
446 }
447
448 void AudioFileModel::updateMetaInfo(const AudioFileModel &model)
449 {
450         if(!model.fileArtist().isEmpty()) setFileArtist(model.fileArtist());
451         if(!model.fileAlbum().isEmpty()) setFileAlbum(model.fileAlbum());
452         if(!model.fileGenre().isEmpty()) setFileGenre(model.fileGenre());
453         if(!model.fileComment().isEmpty()) setFileComment(model.fileComment());
454         if(model.fileYear()) setFileYear(model.fileYear());
455 }