1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
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.
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.
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.
19 // http://www.gnu.org/licenses/gpl-2.0.txt
20 ///////////////////////////////////////////////////////////////////////////////
22 #include "Model_AudioFile.h"
26 #include <QMutexLocker>
29 QMutex AudioFileModel::m_mutexCovers;
30 QMap<QString, unsigned int> AudioFileModel::m_counterCovers;
31 QMap<QString, QFile*> AudioFileModel::m_locksCovers;
33 ////////////////////////////////////////////////////////////
34 // Constructor & Destructor
35 ////////////////////////////////////////////////////////////
37 AudioFileModel::AudioFileModel(const QString &path, const QString &name)
45 AudioFileModel::AudioFileModel(const AudioFileModel &model, bool copyMetaInfo)
49 setFilePath(model.m_filePath);
50 setFormatContainerType(model.m_formatContainerType);
51 setFormatContainerProfile(model.m_formatContainerProfile);
52 setFormatAudioType(model.m_formatAudioType);
53 setFormatAudioProfile(model.m_formatAudioProfile);
54 setFormatAudioVersion(model.m_formatAudioVersion);
55 setFormatAudioSamplerate(model.m_formatAudioSamplerate);
56 setFormatAudioChannels(model.m_formatAudioChannels);
57 setFormatAudioBitdepth(model.m_formatAudioBitdepth);
58 setFileDuration(model.m_fileDuration);
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);
73 AudioFileModel &AudioFileModel::operator=(const AudioFileModel &model)
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);
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);
98 AudioFileModel::~AudioFileModel(void)
100 if(!m_fileCover.isEmpty())
102 setFileCover(QString());
106 ////////////////////////////////////////////////////////////
108 ////////////////////////////////////////////////////////////
110 void AudioFileModel::resetAll(void)
114 m_fileArtist.clear();
117 m_fileComment.clear();
124 m_formatContainerType.clear();
125 m_formatContainerProfile.clear();
126 m_formatAudioType.clear();
127 m_formatAudioProfile.clear();
128 m_formatAudioVersion.clear();
130 m_formatAudioSamplerate = 0;
131 m_formatAudioChannels = 0;
132 m_formatAudioBitdepth = 0;
135 ////////////////////////////////////////////////////////////
137 ////////////////////////////////////////////////////////////
139 // ---------------------------------
141 // ---------------------------------
143 const QString &AudioFileModel::filePath(void) const
148 const QString &AudioFileModel::fileName(void) const
153 const QString &AudioFileModel::fileArtist(void) const
158 const QString &AudioFileModel::fileAlbum(void) const
163 const QString &AudioFileModel::fileGenre(void) const
168 const QString &AudioFileModel::fileComment(void) const
170 return m_fileComment;
173 const QString &AudioFileModel::fileCover(void) const
178 unsigned int AudioFileModel::fileYear(void) const
183 unsigned int AudioFileModel::filePosition(void) const
185 return m_filePosition;
188 unsigned int AudioFileModel::fileDuration(void) const
190 return m_fileDuration;
193 const QString &AudioFileModel::formatContainerType(void) const
195 return m_formatContainerType;
198 const QString &AudioFileModel::formatContainerProfile(void) const
200 return m_formatContainerProfile;
203 const QString &AudioFileModel::formatAudioType(void) const
205 return m_formatAudioType;
208 const QString &AudioFileModel::formatAudioProfile(void) const
210 return m_formatAudioProfile;
213 const QString &AudioFileModel::formatAudioVersion(void) const
215 return m_formatAudioVersion;
218 unsigned int AudioFileModel::formatAudioSamplerate(void) const
220 return m_formatAudioSamplerate;
223 unsigned int AudioFileModel::formatAudioChannels(void) const
225 return m_formatAudioChannels;
228 unsigned int AudioFileModel::formatAudioBitdepth(void) const
230 return m_formatAudioBitdepth;
233 const QString AudioFileModel::fileDurationInfo(void) const
237 QTime time = QTime().addSecs(m_fileDuration);
238 return time.toString("hh:mm:ss");
246 const QString AudioFileModel::formatContainerInfo(void) const
248 if(!m_formatContainerType.isEmpty())
250 QString info = m_formatContainerType;
251 if(!m_formatContainerProfile.isEmpty()) info.append(QString(" (%1: %2)").arg(tr("Profile"), m_formatContainerProfile));
260 const QString AudioFileModel::formatAudioBaseInfo(void) const
262 if(m_formatAudioSamplerate || m_formatAudioChannels || m_formatAudioBitdepth)
265 if(m_formatAudioChannels)
267 if(!info.isEmpty()) info.append(", ");
268 info.append(QString("%1: %2").arg(tr("Channels"), QString::number(m_formatAudioChannels)));
270 if(m_formatAudioSamplerate)
272 if(!info.isEmpty()) info.append(", ");
273 info.append(QString("%1: %2 Hz").arg(tr("Samplerate"), QString::number(m_formatAudioSamplerate)));
275 if(m_formatAudioBitdepth)
277 if(!info.isEmpty()) info.append(", ");
278 info.append(QString("%1: %2 Bit").arg(tr("Bitdepth"), QString::number(m_formatAudioBitdepth)));
288 const QString AudioFileModel::formatAudioCompressInfo(void) const
290 if(!m_formatAudioType.isEmpty())
293 if(!m_formatAudioProfile.isEmpty() || !m_formatAudioVersion.isEmpty())
295 info.append(QString("%1: ").arg(tr("Type")));
297 info.append(m_formatAudioType);
298 if(!m_formatAudioProfile.isEmpty())
300 info.append(QString(", %1: %2").arg(tr("Profile"), m_formatAudioProfile));
302 if(!m_formatAudioVersion.isEmpty())
304 info.append(QString(", %1: %2").arg(tr("Version"), m_formatAudioVersion));
314 // ---------------------------------
316 // ---------------------------------
318 void AudioFileModel::setFilePath(const QString &path)
323 void AudioFileModel::setFileName(const QString &name)
328 void AudioFileModel::setFileArtist(const QString &artist)
330 m_fileArtist = artist;
333 void AudioFileModel::setFileAlbum(const QString &album)
338 void AudioFileModel::setFileGenre(const QString &genre)
343 void AudioFileModel::setFileComment(const QString &comment)
345 m_fileComment = comment;
348 void AudioFileModel::setFileCover(const QString &coverFile)
350 QMutexLocker lock(&m_mutexCovers);
351 if(m_fileCover.isEmpty() || coverFile.isEmpty() || (m_fileCover.compare(coverFile, Qt::CaseInsensitive) != 0))
353 if(!m_fileCover.isEmpty() && m_counterCovers.contains(m_fileCover))
355 if(--m_counterCovers[m_fileCover] < 1)
357 m_counterCovers.remove(m_fileCover);
358 if(m_locksCovers.contains(m_fileCover))
360 delete m_locksCovers[m_fileCover];
361 m_locksCovers.remove(m_fileCover);
363 QFile::remove(m_fileCover);
366 if(!coverFile.isEmpty())
368 if(!m_counterCovers.contains(coverFile))
370 m_counterCovers.insert(coverFile, 0);
371 m_locksCovers.insert(coverFile, new QFile(coverFile));
372 m_locksCovers[coverFile]->open(QIODevice::ReadOnly);
374 m_counterCovers[coverFile]++;
378 m_fileCover = coverFile;
381 void AudioFileModel::setFileYear(unsigned int year)
386 void AudioFileModel::setFilePosition(unsigned int position)
388 m_filePosition = position;
391 void AudioFileModel::setFileDuration(unsigned int duration)
393 m_fileDuration = duration;
396 void AudioFileModel::setFormatContainerType(const QString &type)
398 m_formatContainerType = type;
401 void AudioFileModel::setFormatContainerProfile(const QString &profile)
403 m_formatContainerProfile = profile;
406 void AudioFileModel::setFormatAudioType(const QString &type)
408 m_formatAudioType = type;
411 void AudioFileModel::setFormatAudioProfile(const QString &profile)
413 m_formatAudioProfile = profile;
416 void AudioFileModel::setFormatAudioVersion(const QString &version)
418 m_formatAudioVersion = version;
421 void AudioFileModel::setFormatAudioSamplerate(unsigned int samplerate)
423 m_formatAudioSamplerate = samplerate;
426 void AudioFileModel::setFormatAudioChannels(unsigned int channels)
428 m_formatAudioChannels = channels;
431 void AudioFileModel::setFormatAudioBitdepth(unsigned int bitdepth)
433 m_formatAudioBitdepth = bitdepth;
436 void AudioFileModel::updateMetaInfo(const AudioFileModel &model)
438 if(!model.fileArtist().isEmpty()) setFileArtist(model.fileArtist());
439 if(!model.fileAlbum().isEmpty()) setFileAlbum(model.fileAlbum());
440 if(!model.fileGenre().isEmpty()) setFileGenre(model.fileGenre());
441 if(!model.fileComment().isEmpty()) setFileComment(model.fileComment());
442 if(model.fileYear()) setFileYear(model.fileYear());