1
///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2017 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, but always including the *additional*
9 // restrictions defined in the "License.txt" file.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this program; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
23 #include "Model_AudioFile.h"
29 #include <MUtils/Global.h>
34 #include <QMutexLocker>
40 const unsigned int AudioFileModel::BITDEPTH_IEEE_FLOAT32
= UINT_MAX
-1;
42 #define PRINT_S(VAR) do \
44 if((VAR).isEmpty()) qDebug(#VAR " = N/A"); else qDebug(#VAR " = \"%s\"", MUTILS_UTF8((VAR))); \
48 #define PRINT_U(VAR) do \
50 if((VAR) < 1) qDebug(#VAR " = N/A"); else qDebug(#VAR " = %u", (VAR)); \
54 //if((!(OTHER.NAME.isEmpty())) && ((FORCE) || (this.NAME.isEmpty()))) /*this.NAME = OTHER.NAME;*/ \
56 #define UPDATE_STR(OTHER, FORCE, NAME) do \
58 if(!(((OTHER).NAME).isEmpty())) \
60 if((FORCE) || ((this->NAME).isEmpty())) (this->NAME) = ((OTHER).NAME); \
65 #define UPDATE_INT(OTHER, FORCE, NAME) do \
67 if(((OTHER).NAME) > 0) \
69 if((FORCE) || ((this->NAME) == 0)) (this->NAME) = ((OTHER).NAME); \
74 #define ASSIGN_VAL(OTHER, NAME) do \
76 (this->NAME) = ((OTHER).NAME); \
80 ///////////////////////////////////////////////////////////////////////////////
81 // Audio File - Meta Info
82 ///////////////////////////////////////////////////////////////////////////////
84 AudioFileModel_MetaInfo::AudioFileModel_MetaInfo(void)
89 AudioFileModel_MetaInfo::AudioFileModel_MetaInfo(const AudioFileModel_MetaInfo
&model
)
91 ASSIGN_VAL(model
, m_titel
);
92 ASSIGN_VAL(model
, m_artist
);
93 ASSIGN_VAL(model
, m_album
);
94 ASSIGN_VAL(model
, m_genre
);
95 ASSIGN_VAL(model
, m_comment
);
96 ASSIGN_VAL(model
, m_cover
);
97 ASSIGN_VAL(model
, m_year
);
98 ASSIGN_VAL(model
, m_position
);
101 AudioFileModel_MetaInfo
&AudioFileModel_MetaInfo::operator=(const AudioFileModel_MetaInfo
&model
)
103 ASSIGN_VAL(model
, m_titel
);
104 ASSIGN_VAL(model
, m_artist
);
105 ASSIGN_VAL(model
, m_album
);
106 ASSIGN_VAL(model
, m_genre
);
107 ASSIGN_VAL(model
, m_comment
);
108 ASSIGN_VAL(model
, m_cover
);
109 ASSIGN_VAL(model
, m_year
);
110 ASSIGN_VAL(model
, m_position
);
115 #define IS_EMPTY(X) ((X).isEmpty() ? "YES" : "NO")
117 void AudioFileModel_MetaInfo::update(const AudioFileModel_MetaInfo
&model
, const bool replace
)
119 UPDATE_STR(model
, replace
, m_titel
);
120 UPDATE_STR(model
, replace
, m_artist
);
121 UPDATE_STR(model
, replace
, m_album
);
122 UPDATE_STR(model
, replace
, m_genre
);
123 UPDATE_STR(model
, replace
, m_comment
);
124 UPDATE_STR(model
, replace
, m_cover
);
125 UPDATE_INT(model
, replace
, m_year
);
126 UPDATE_INT(model
, replace
, m_position
);
129 AudioFileModel_MetaInfo::~AudioFileModel_MetaInfo(void)
134 void AudioFileModel_MetaInfo::reset(void)
146 void AudioFileModel_MetaInfo::print(void) const
153 PRINT_S(m_cover
.filePath());
158 bool AudioFileModel_MetaInfo::empty(const bool &ignoreArtwork
) const
162 if(!m_titel
.isEmpty()) isEmpty
= false;
163 if(!m_artist
.isEmpty()) isEmpty
= false;
164 if(!m_album
.isEmpty()) isEmpty
= false;
165 if(!m_genre
.isEmpty()) isEmpty
= false;
166 if(!m_comment
.isEmpty()) isEmpty
= false;
167 if(m_year
) isEmpty
= false;
168 if(m_position
) isEmpty
= false;
172 if(!m_cover
.isEmpty())
181 ///////////////////////////////////////////////////////////////////////////////
182 // Audio File - Technical Info
183 ///////////////////////////////////////////////////////////////////////////////
185 AudioFileModel_TechInfo::AudioFileModel_TechInfo(void)
190 AudioFileModel_TechInfo::AudioFileModel_TechInfo(const AudioFileModel_TechInfo
&model
)
192 ASSIGN_VAL(model
, m_containerType
);
193 ASSIGN_VAL(model
, m_containerProfile
);
194 ASSIGN_VAL(model
, m_audioType
);
195 ASSIGN_VAL(model
, m_audioProfile
);
196 ASSIGN_VAL(model
, m_audioVersion
);
197 ASSIGN_VAL(model
, m_audioEncodeLib
);
198 ASSIGN_VAL(model
, m_audioSamplerate
);
199 ASSIGN_VAL(model
, m_audioChannels
);
200 ASSIGN_VAL(model
, m_audioBitdepth
);
201 ASSIGN_VAL(model
, m_audioBitrate
);
202 ASSIGN_VAL(model
, m_audioBitrateMode
);
203 ASSIGN_VAL(model
, m_duration
);
206 AudioFileModel_TechInfo
&AudioFileModel_TechInfo::operator=(const AudioFileModel_TechInfo
&model
)
208 ASSIGN_VAL(model
, m_containerType
);
209 ASSIGN_VAL(model
, m_containerProfile
);
210 ASSIGN_VAL(model
, m_audioType
);
211 ASSIGN_VAL(model
, m_audioProfile
);
212 ASSIGN_VAL(model
, m_audioVersion
);
213 ASSIGN_VAL(model
, m_audioEncodeLib
);
214 ASSIGN_VAL(model
, m_audioSamplerate
);
215 ASSIGN_VAL(model
, m_audioChannels
);
216 ASSIGN_VAL(model
, m_audioBitdepth
);
217 ASSIGN_VAL(model
, m_audioBitrate
);
218 ASSIGN_VAL(model
, m_audioBitrateMode
);
219 ASSIGN_VAL(model
, m_duration
);
224 AudioFileModel_TechInfo::~AudioFileModel_TechInfo(void)
229 void AudioFileModel_TechInfo::reset(void)
231 m_containerType
.clear();
232 m_containerProfile
.clear();
234 m_audioProfile
.clear();
235 m_audioVersion
.clear();
236 m_audioEncodeLib
.clear();
237 m_audioSamplerate
= 0;
241 m_audioBitrateMode
= 0;
245 ////////////////////////////////////////////////////////////
247 ////////////////////////////////////////////////////////////
249 AudioFileModel::AudioFileModel(const QString
&path
)
257 AudioFileModel::AudioFileModel(const AudioFileModel
&model
)
259 ASSIGN_VAL(model
, m_filePath
);
260 ASSIGN_VAL(model
, m_metaInfo
);
261 ASSIGN_VAL(model
, m_techInfo
);
264 AudioFileModel
&AudioFileModel::operator=(const AudioFileModel
&model
)
266 ASSIGN_VAL(model
, m_filePath
);
267 ASSIGN_VAL(model
, m_metaInfo
);
268 ASSIGN_VAL(model
, m_techInfo
);
273 AudioFileModel::~AudioFileModel(void)
279 void AudioFileModel::reset(void)
286 /*------------------------------------*/
288 /*------------------------------------*/
290 const QString
AudioFileModel::durationInfo(void) const
292 if(m_techInfo
.duration())
294 QTime time
= QTime().addSecs(m_techInfo
.duration());
295 return time
.toString("hh:mm:ss");
303 const QString
AudioFileModel::containerInfo(void) const
305 if(!m_techInfo
.containerType().isEmpty())
307 QString info
= m_techInfo
.containerType();
308 if(!m_techInfo
.containerProfile().isEmpty()) info
.append(QString(" (%1: %2)").arg(tr("Profile"), m_techInfo
.containerProfile()));
317 const QString
AudioFileModel::audioBaseInfo(void) const
319 if(m_techInfo
.audioSamplerate() || m_techInfo
.audioChannels() || m_techInfo
.audioBitdepth())
322 if(m_techInfo
.audioChannels())
324 if(!info
.isEmpty()) info
.append(", ");
325 info
.append(QString("%1: %2").arg(tr("Channels"), QString::number(m_techInfo
.audioChannels())));
327 if(m_techInfo
.audioSamplerate())
329 if(!info
.isEmpty()) info
.append(", ");
330 info
.append(QString("%1: %2 Hz").arg(tr("Samplerate"), QString::number(m_techInfo
.audioSamplerate())));
332 if(m_techInfo
.audioBitdepth())
334 if(!info
.isEmpty()) info
.append(", ");
335 if(m_techInfo
.audioBitdepth() == BITDEPTH_IEEE_FLOAT32
)
337 info
.append(QString("%1: %2 Bit (IEEE Float)").arg(tr("Bitdepth"), QString::number(32)));
341 info
.append(QString("%1: %2 Bit").arg(tr("Bitdepth"), QString::number(m_techInfo
.audioBitdepth())));
352 const QString
AudioFileModel::audioCompressInfo(void) const
354 if(!m_techInfo
.audioType().isEmpty())
357 if(!m_techInfo
.audioProfile().isEmpty() || !m_techInfo
.audioVersion().isEmpty())
359 info
.append(QString("%1: ").arg(tr("Type")));
361 info
.append(m_techInfo
.audioType());
362 if(!m_techInfo
.audioProfile().isEmpty())
364 info
.append(QString(", %1: %2").arg(tr("Profile"), m_techInfo
.audioProfile()));
366 if(!m_techInfo
.audioVersion().isEmpty())
368 info
.append(QString(", %1: %2").arg(tr("Version"), m_techInfo
.audioVersion()));
370 if(m_techInfo
.audioBitrate() > 0)
372 switch(m_techInfo
.audioBitrateMode())
374 case BitrateModeConstant
:
375 info
.append(QString(", %1: %2 kbps (%3)").arg(tr("Bitrate"), QString::number(m_techInfo
.audioBitrate()), tr("Constant")));
377 case BitrateModeVariable
:
378 info
.append(MUTILS_QSTR(L
", %1: \u2248%2 kbps (%3)").arg(tr("Bitrate"), QString::number(m_techInfo
.audioBitrate()), tr("Variable")));
381 info
.append(QString(", %1: %2 kbps").arg(tr("Bitrate"), QString::number(m_techInfo
.audioBitrate())));
385 if(!m_techInfo
.audioEncodeLib().isEmpty())
387 info
.append(QString(", %1: %2").arg(tr("Encoder"), m_techInfo
.audioEncodeLib()));