39 changes: 20 additions & 19 deletions mythplugins/mythmusic/mythmusic/musicplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ void MusicPlayer::loadSettings(void)
m_resumeModeEditor = (ResumeMode) gCoreContext->GetNumSetting("ResumeModeEditor", MusicPlayer::RESUME_OFF);
m_resumeModeRadio = (ResumeMode) gCoreContext->GetNumSetting("ResumeModeRadio", MusicPlayer::RESUME_TRACK);

m_lastplayDelay = gCoreContext->GetNumSetting("MusicLastPlayDelay", LASTPLAY_DELAY);
m_lastplayDelay = gCoreContext->GetDurSetting<std::chrono::seconds>("MusicLastPlayDelay", LASTPLAY_DELAY);
m_autoShowPlayer = (gCoreContext->GetNumSetting("MusicAutoShowPlayer", 1) > 0);
}

Expand Down Expand Up @@ -870,16 +870,16 @@ void MusicPlayer::customEvent(QEvent *event)
return;

if (m_playMode != PLAYMODE_RADIO)
m_currentTime = oe->elapsedSeconds().count();
m_currentTime = oe->elapsedSeconds();
else
m_currentTime = oe->elapsedSeconds().count() - m_lastTrackStart;
m_currentTime = oe->elapsedSeconds() - m_lastTrackStart;

if (m_playMode != PLAYMODE_RADIO && !m_updatedLastplay)
{
// we update the lastplay and playcount after playing
// for m_lastplayDelay seconds or half the total track time
if ((getCurrentMetadata() && m_currentTime >
(getCurrentMetadata()->Length() / 1000) / 2) ||
if ((getCurrentMetadata() &&
m_currentTime > duration_cast<std::chrono::seconds>(getCurrentMetadata()->Length()) / 2) ||
m_currentTime >= m_lastplayDelay)
{
updateLastplay();
Expand All @@ -891,7 +891,7 @@ void MusicPlayer::customEvent(QEvent *event)
{
if (!m_playedList.isEmpty())
{
m_playedList.last()->setLength(m_currentTime * 1000);
m_playedList.last()->setLength(m_currentTime);
// this will update any track lengths displayed on screen
gPlayer->sendMetadataChangedEvent(m_playedList.last()->ID());
}
Expand All @@ -907,13 +907,14 @@ void MusicPlayer::customEvent(QEvent *event)
}
else
{
auto metadataSecs = duration_cast<std::chrono::seconds>(getCurrentMetadata()->Length());
if (m_playMode != PLAYMODE_RADIO && getCurrentMetadata() &&
m_currentTime != getCurrentMetadata()->Length() / 1000)
m_currentTime != metadataSecs)
{
LOG(VB_GENERAL, LOG_NOTICE, QString("MusicPlayer: Updating track length was %1s, should be %2s")
.arg(getCurrentMetadata()->Length() / 1000).arg(m_currentTime));
.arg(metadataSecs.count()).arg(m_currentTime.count()));

getCurrentMetadata()->setLength(m_currentTime * 1000);
getCurrentMetadata()->setLength(m_currentTime);
getCurrentMetadata()->dumpToDatabase();

// this will update any track lengths displayed on screen
Expand Down Expand Up @@ -1059,7 +1060,7 @@ void MusicPlayer::savePosition(void)
else
{
gCoreContext->SaveSetting("MusicBookmark", getCurrentMetadata()->ID());
gCoreContext->SaveSetting("MusicBookmarkPosition", m_currentTime);
gCoreContext->SaveDurSetting("MusicBookmarkPosition", m_currentTime);
}
}

Expand Down Expand Up @@ -1099,19 +1100,19 @@ void MusicPlayer::restorePosition(void)
play();

if (gPlayer->getResumeMode() == MusicPlayer::RESUME_EXACT && m_playMode != PLAYMODE_RADIO)
seek(gCoreContext->GetNumSetting("MusicBookmarkPosition", 0));
seek(gCoreContext->GetDurSetting<std::chrono::seconds>("MusicBookmarkPosition", 0s));
}
}

void MusicPlayer::seek(int pos)
void MusicPlayer::seek(std::chrono::seconds pos)
{
if (m_output)
{
Decoder *decoder = getDecoder();
if (decoder && decoder->isRunning())
decoder->seek(pos);
decoder->seek(pos.count());

m_output->SetTimecode(std::chrono::seconds(pos));
m_output->SetTimecode(pos);
}
}

Expand Down Expand Up @@ -1537,8 +1538,8 @@ void MusicPlayer::decoderHandlerReady(void)
decoder->addListener(*it);
}

m_currentTime = 0;
m_lastTrackStart = 0;
m_currentTime = 0s;
m_lastTrackStart = 0s;

// NOLINTNEXTLINE(modernize-loop-convert)
for (auto it = m_visualisers.begin(); it != m_visualisers.end() ; ++it)
Expand All @@ -1556,10 +1557,10 @@ void MusicPlayer::decoderHandlerReady(void)
decoder->start();

if (!m_oneshotMetadata && getResumeMode() == RESUME_EXACT &&
gCoreContext->GetNumSetting("MusicBookmarkPosition", 0) > 0)
gCoreContext->GetDurSetting<std::chrono::seconds>("MusicBookmarkPosition", 0s) > 0s)
{
seek(gCoreContext->GetNumSetting("MusicBookmarkPosition", 0));
gCoreContext->SaveSetting("MusicBookmarkPosition", 0);
seek(gCoreContext->GetDurSetting<std::chrono::seconds>("MusicBookmarkPosition", 0s));
gCoreContext->SaveDurSetting("MusicBookmarkPosition", 0s);
}

m_isPlaying = true;
Expand Down
12 changes: 6 additions & 6 deletions mythplugins/mythmusic/mythmusic/musicplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "decoderhandler.h"

// how long to wait before updating the lastplay and playcount fields
#define LASTPLAY_DELAY 15
static constexpr std::chrono::seconds LASTPLAY_DELAY { 15s };

class AudioOutput;
class MainVisual;
Expand Down Expand Up @@ -133,15 +133,15 @@ class MusicPlayer : public QObject, public MythObservable
bool setCurrentTrackPos(int pos);
void changeCurrentTrack(int trackNo);

int getCurrentTrackTime(void) const { return m_currentTime; }
std::chrono::seconds getCurrentTrackTime(void) const { return m_currentTime; }

void activePlaylistChanged(int trackID, bool deleted);
void playlistChanged(int playlistID);

void savePosition(void);
void restorePosition(void);
void setAllowRestorePos(bool allow) { m_allowRestorePos = allow; }
void seek(int pos);
void seek(std::chrono::seconds pos);

MusicMetadata *getCurrentMetadata(void);
MusicMetadata *getNextMetadata(void);
Expand Down Expand Up @@ -210,7 +210,7 @@ class MusicPlayer : public QObject, public MythObservable
void decoderHandlerReady(void);

int m_currentTrack {-1};
int m_currentTime {0};
std::chrono::seconds m_currentTime {0s};

MusicMetadata *m_oneshotMetadata {nullptr};

Expand All @@ -228,7 +228,7 @@ class MusicPlayer : public QObject, public MythObservable
bool m_updatedLastplay {false};
bool m_allowRestorePos {true};

int m_lastplayDelay {LASTPLAY_DELAY};
std::chrono::seconds m_lastplayDelay {LASTPLAY_DELAY};

ShuffleMode m_shuffleMode {SHUFFLE_OFF};
RepeatMode m_repeatMode {REPEAT_OFF};
Expand All @@ -244,7 +244,7 @@ class MusicPlayer : public QObject, public MythObservable

// radio stuff
QList<MusicMetadata*> m_playedList;
int m_lastTrackStart {0};
std::chrono::seconds m_lastTrackStart {0s};
int m_bufferAvailable {0};
int m_bufferSize {0};

Expand Down
15 changes: 8 additions & 7 deletions mythplugins/mythmusic/mythmusic/playlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,10 +489,11 @@ void Playlist::describeYourself(void) const
LOG(VB_GENERAL, LOG_INFO, LOC + msg);
}

void Playlist::getStats(uint *trackCount, uint *totalLength, uint currenttrack, uint *playedLength) const
void Playlist::getStats(uint *trackCount, std::chrono::seconds *totalLength,
uint currenttrack, std::chrono::seconds *playedLength) const
{
uint64_t total = 0;
uint64_t played = 0;
std::chrono::milliseconds total = 0ms;
std::chrono::milliseconds played = 0ms;

*trackCount = m_shuffledSongs.size();

Expand All @@ -511,9 +512,9 @@ void Playlist::getStats(uint *trackCount, uint *totalLength, uint currenttrack,
}

if (playedLength)
*playedLength = played / 1000;
*playedLength = duration_cast<std::chrono::seconds>(played);

*totalLength = total / 1000;
*totalLength = duration_cast<std::chrono::seconds>(total);
}

void Playlist::loadPlaylist(const QString& a_name, const QString& a_host)
Expand Down Expand Up @@ -1012,7 +1013,7 @@ void Playlist::savePlaylist(const QString& a_name, const QString& a_host)

MSqlQuery query(MSqlQuery::InitCon());
uint songcount = 0;
uint playtime = 0;
std::chrono::seconds playtime = 0s;

getStats(&songcount, &playtime);

Expand Down Expand Up @@ -1048,7 +1049,7 @@ void Playlist::savePlaylist(const QString& a_name, const QString& a_host)
query.bindValue(":LIST", rawSonglist);
query.bindValue(":NAME", a_name);
query.bindValue(":SONGCOUNT", songcount);
query.bindValue(":PLAYTIME", qlonglong(playtime));
query.bindValue(":PLAYTIME", qlonglong(playtime.count()));
if (save_host)
query.bindValue(":HOSTNAME", a_host);

Expand Down
3 changes: 2 additions & 1 deletion mythplugins/mythmusic/mythmusic/playlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ class Playlist : public QObject
int getID(void) const { return m_playlistid; }
void setID(int x) { m_playlistid = x; }

void getStats(uint *trackCount, uint *totalLength, uint currentTrack = 0, uint *playedLength = nullptr) const;
void getStats(uint *trackCount, std::chrono::seconds *totalLength,
uint currentTrack = 0, std::chrono::seconds *playedLength = nullptr) const;

void resync(void);

Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmyth/audio/audiooutputca.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ std::chrono::milliseconds AudioOutputCA::GetAudiotime(void)

int totalbuffer = audioready() + GetBufferedOnSoundcard();

return audbuf_timecode - std::chrono::milliseconds(totalbuffer * 100000.0 /
return audbuf_timecode - millisecondsFromFloat(totalbuffer * 100000.0 /
(m_outputBytesPerFrame *
m_effDsp * m_stretchFactor));
}
Expand Down
19 changes: 10 additions & 9 deletions mythtv/libs/libmythmetadata/lyricsdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <QDomDocument>

// mythtv
#include "mythchrono.h"
#include "mythcontext.h"

// libmythmetadata
Expand Down Expand Up @@ -37,7 +38,7 @@ void LyricsData::clear(void)

void LyricsData::clearLyrics(void)
{
QMap<int, LyricsLine*>::iterator i = m_lyricsMap.begin();
auto i = m_lyricsMap.begin();
while (i != m_lyricsMap.end())
{
delete i.value();
Expand Down Expand Up @@ -168,7 +169,7 @@ QString LyricsData::createLyricsXML(void)
grabber.appendChild(doc.createTextNode(m_grabber));

// lyrics
QMap<int, LyricsLine*>::iterator i = m_lyricsMap.begin();
auto i = m_lyricsMap.begin();
while (i != m_lyricsMap.end())
{
LyricsLine *line = (*i);
Expand Down Expand Up @@ -313,8 +314,8 @@ void LyricsData::setLyrics(const QStringList &lyrics)
{
clearLyrics();

int lastTime = -1;
int offset = 0; // offset in milliseconds
std::chrono::milliseconds lastTime = -1ms;
std::chrono::milliseconds offset = 0ms;

for (int x = 0; x < lyrics.count(); x++)
{
Expand All @@ -324,7 +325,7 @@ void LyricsData::setLyrics(const QStringList &lyrics)

if (lyric.startsWith("[offset:"))
{
offset = lyric.midRef(8,lyric.indexOf("]", 8)-8).toInt();
offset = std::chrono::milliseconds(lyric.midRef(8,lyric.indexOf("]", 8)-8).toInt());
}

if (m_syncronized)
Expand All @@ -347,10 +348,10 @@ void LyricsData::setLyrics(const QStringList &lyrics)
{
line->m_lyric = lyric.mid(7);
}
line->m_time = (minutes * 60 * 1000) + (seconds * 1000) + (hundredths * 10);
if (offset > 0)
line->m_time = millisecondsFromParts(0, minutes, seconds, hundredths * 10);
if (offset > 0ms)
{
if (offset > line->m_time) line->m_time = 0;
if (offset > line->m_time) line->m_time = 0ms;
else line->m_time -= offset;
}
else
Expand All @@ -371,7 +372,7 @@ void LyricsData::setLyrics(const QStringList &lyrics)
// synthesize a time code from the track length and the number of lyrics lines
if (m_parent && !m_parent->isRadio())
{
line->m_time = (m_parent->Length() / lyrics.count()) * x;
line->m_time = std::chrono::milliseconds((m_parent->Length() / lyrics.count()) * x);
line->m_lyric = lyric;
lastTime = line->m_time;
}
Expand Down
12 changes: 7 additions & 5 deletions mythtv/libs/libmythmetadata/lyricsdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ class META_PUBLIC LyricsLine
{
public:
LyricsLine() = default;
LyricsLine(int time, QString lyric) :
LyricsLine(std::chrono::milliseconds time, QString lyric) :
m_time(time), m_lyric(std::move(lyric)) { }

int m_time {0};
std::chrono::milliseconds m_time {0ms};
QString m_lyric;

QString toString(bool syncronized)
Expand All @@ -37,12 +37,14 @@ class META_PUBLIC LyricsLine
private:
QString formatTime(void) const
{
QString timestr = MythFormatTimeMs(m_time,"mm:ss.zzz");
QString timestr = MythFormatTimeMs(m_time.count(),"mm:ss.zzz");
timestr.chop(1); // Chop 1 to return hundredths
return QString("[%1]").arg(timestr);
}
};

using LyricsLineMap = QMap<std::chrono::milliseconds, LyricsLine*>;

class META_PUBLIC LyricsData : public QObject
{
Q_OBJECT
Expand Down Expand Up @@ -70,7 +72,7 @@ class META_PUBLIC LyricsData : public QObject
QString title(void) { return m_title; }
void setTitle(const QString &title) { m_title = title; }

QMap<int, LyricsLine*>* lyrics(void) { return &m_lyricsMap; }
LyricsLineMap* lyrics(void) { return &m_lyricsMap; }
void setLyrics(const QStringList &lyrics);

bool syncronized(void) const { return m_syncronized; }
Expand Down Expand Up @@ -103,7 +105,7 @@ class META_PUBLIC LyricsData : public QObject
void loadLyrics(const QString &xmlData);
QString createLyricsXML(void);

QMap<int, LyricsLine*> m_lyricsMap;
LyricsLineMap m_lyricsMap;

MusicMetadata *m_parent {nullptr};

Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmythmetadata/metaio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ MusicMetadata* MetaIO::readFromFilename(const QString &filename, bool blnLength)

readFromFilename(filename, artist, album, title, genre, tracknum);

int length = (blnLength) ? getTrackLength(filename) : 0;
std::chrono::milliseconds length = (blnLength) ? getTrackLength(filename) : 0ms;

auto *retdata = new MusicMetadata(filename, artist, "", album, title, genre,
0, tracknum, length);
Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmythmetadata/metaio.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ class META_PUBLIC MetaIO
void saveTimeStamps(void);
void restoreTimeStamps(void);

virtual int getTrackLength(const QString &filename) = 0;
virtual std::chrono::milliseconds getTrackLength(const QString &filename) = 0;

QString m_filename;
QString m_filenameFormat;
Expand Down
35 changes: 18 additions & 17 deletions mythtv/libs/libmythmetadata/metaioavfcomment.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}

// libmythmetadata
#include "metaioavfcomment.h"
#include "musicmetadata.h"
Expand All @@ -7,11 +12,6 @@
#include <mythconfig.h>
#include <mythcontext.h>

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}

/*!
* \copydoc MetaIO::write()
*/
Expand Down Expand Up @@ -78,7 +78,7 @@ MusicMetadata* MetaIOAVFComment::read(const QString &filename)
tracknum = atoi(tag->value);
}

int length = getTrackLength(p_context);
std::chrono::milliseconds length = getTrackLength(p_context);

auto *retdata = new MusicMetadata(filename, artist, compilation_artist, album,
title, genre, year, tracknum, length);
Expand All @@ -91,12 +91,12 @@ MusicMetadata* MetaIOAVFComment::read(const QString &filename)
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param filename The filename for which we want to find the length.
* \returns An integer (signed!) to represent the length in seconds.
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOAVFComment::getTrackLength(const QString &filename)
std::chrono::milliseconds MetaIOAVFComment::getTrackLength(const QString &filename)
{
AVFormatContext* p_context = nullptr;
AVInputFormat* p_inputformat = nullptr;
Expand All @@ -106,29 +106,30 @@ int MetaIOAVFComment::getTrackLength(const QString &filename)
if ((avformat_open_input(&p_context, local8bit.constData(),
p_inputformat, nullptr) < 0))
{
return 0;
return 0ms;
}

if (avformat_find_stream_info(p_context, nullptr) < 0)
return 0;
return 0ms;

int rv = getTrackLength(p_context);
std::chrono::milliseconds rv = getTrackLength(p_context);

avformat_close_input(&p_context);

return rv;
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param pContext The AV Format Context.
* \returns An integer (signed!) to represent the length in seconds.
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOAVFComment::getTrackLength(AVFormatContext* pContext)
std::chrono::milliseconds MetaIOAVFComment::getTrackLength(AVFormatContext* pContext)
{
if (!pContext)
return 0;
return 0ms;

return (pContext->duration / AV_TIME_BASE) * 1000;
auto time = av_duration(pContext->duration);
return duration_cast<std::chrono::milliseconds>(time);
}
4 changes: 2 additions & 2 deletions mythtv/libs/libmythmetadata/metaioavfcomment.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class META_PUBLIC MetaIOAVFComment : public MetaIO
MusicMetadata* read(const QString &filename) override; // MetaIO

private:
int getTrackLength(const QString &filename) override; // MetaIO
static int getTrackLength(AVFormatContext* pContext);
std::chrono::milliseconds getTrackLength(const QString &filename) override; // MetaIO
static std::chrono::milliseconds getTrackLength(AVFormatContext* pContext);
};

#endif
Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmythmetadata/metaioflacvorbis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ MusicMetadata* MetaIOFLACVorbis::read(const QString &filename)

metadata->setCompilation(compilation);

if (metadata->Length() <= 0)
if (metadata->Length() <= 0ms)
metadata->setLength(getTrackLength(flacfile));

if (tag->contains("DISCNUMBER"))
Expand Down
3 changes: 2 additions & 1 deletion mythtv/libs/libmythmetadata/metaioid3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,8 @@ MusicMetadata *MetaIOID3::read(const QString &filename)
}

LOG(VB_FILE, LOG_DEBUG,
QString("MetaIOID3::read: Length for '%1' from properties is '%2'\n").arg(filename).arg(metadata->Length()));
QString("MetaIOID3::read: Length for '%1' from properties is '%2'\n")
.arg(filename).arg(metadata->Length().count()));

// Look for MythTVLastPlayed in TXXX Frame
UserTextIdentificationFrame *lastplayed = find(tag, "MythTVLastPlayed");
Expand Down
37 changes: 19 additions & 18 deletions mythtv/libs/libmythmetadata/metaiomp4.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@

// Libav*
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}

// libmythmetadata
#include "metaiomp4.h"
#include "musicmetadata.h"
Expand All @@ -7,12 +13,6 @@
#include <mythlogging.h>
#include <mythcontext.h>

// Libav*
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
}

/*!
* \copydoc MetaIO::write()
*/
Expand Down Expand Up @@ -75,7 +75,7 @@ MusicMetadata* MetaIOMP4::read(const QString &filename)
QString genre;
int year = 0;
int tracknum = 0;
int length = 0;
std::chrono::milliseconds length = 0ms;
bool compilation = false;

AVFormatContext* p_context = nullptr;
Expand Down Expand Up @@ -161,12 +161,12 @@ QString MetaIOMP4::getFieldValue(AVFormatContext* context, const char* tagname)
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param filename The filename for which we want to find the length.
* \returns An integer (signed!) to represent the length in seconds.
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOMP4::getTrackLength(const QString &filename)
std::chrono::milliseconds MetaIOMP4::getTrackLength(const QString &filename)
{
AVFormatContext* p_context = nullptr;
AVInputFormat* p_inputformat = nullptr;
Expand All @@ -176,33 +176,34 @@ int MetaIOMP4::getTrackLength(const QString &filename)
if ((avformat_open_input(&p_context, local8bit.constData(),
p_inputformat, nullptr) < 0))
{
return 0;
return 0ms;
}

if (avformat_find_stream_info(p_context, nullptr) < 0)
return 0;
return 0ms;

int rv = getTrackLength(p_context);
std::chrono::milliseconds rv = getTrackLength(p_context);

avformat_close_input(&p_context);

return rv;
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param pContext The AV Format Context.
* \returns An integer (signed!) to represent the length in seconds.
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOMP4::getTrackLength(AVFormatContext* pContext)
std::chrono::milliseconds MetaIOMP4::getTrackLength(AVFormatContext* pContext)
{
if (!pContext)
return 0;
return 0ms;

av_estimate_timings(pContext, 0);

return (pContext->duration / AV_TIME_BASE) * 1000;
auto time = av_duration(pContext->duration);
return duration_cast<std::chrono::milliseconds>(time);
}

/*!
Expand Down
4 changes: 2 additions & 2 deletions mythtv/libs/libmythmetadata/metaiomp4.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ class META_PUBLIC MetaIOMP4 : public MetaIO
MusicMetadata* read(const QString &filename) override; // MetaIO

private:
int getTrackLength(const QString &filename) override; // MetaIO
static int getTrackLength(AVFormatContext* pContext);
std::chrono::milliseconds getTrackLength(const QString &filename) override; // MetaIO
static std::chrono::milliseconds getTrackLength(AVFormatContext* pContext);
static QString getFieldValue(AVFormatContext* context, const char* tagname);
static void metadataSanityCheck(QString *artist, QString *album, QString *title, QString *genre);
};
Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmythmetadata/metaiooggvorbis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ MusicMetadata* MetaIOOggVorbis::read(const QString &filename)

metadata->setCompilation(compilation);

if (metadata->Length() <= 0)
if (metadata->Length() <= 0ms)
metadata->setLength(getTrackLength(oggfile));

delete oggfile;
Expand Down
18 changes: 9 additions & 9 deletions mythtv/libs/libmythmetadata/metaiotaglib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,38 +81,38 @@ void MetaIOTagLib::ReadGenericMetadata(Tag *tag, MusicMetadata *metadata)
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param file Pointer to file object
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOTagLib::getTrackLength(TagLib::File *file)
std::chrono::milliseconds MetaIOTagLib::getTrackLength(TagLib::File *file)
{
int milliseconds = 0;
std::chrono::milliseconds milliseconds = 0ms;

if (file && file->audioProperties())
milliseconds = file->audioProperties()->length() * 1000;
milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());

This comment has been minimized.

Copy link
@warpme

warpme Jan 26, 2021

Contributor

this change makes compilation failing (for me) like this:

metaiotaglib.cpp:94:75: error: ‘class TagLib::AudioProperties’ has no member named ‘lengthInMilliseconds’
94 | milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());
| ^~~~~~~~~~~~~~~~~~~~
metaiotaglib.cpp: In member function ‘virtual std::chrono::milliseconds MetaIOTagLib::getTrackLength(const QString&)’:


return milliseconds;
}

/*!
* \brief Find the length of the track (in seconds)
* \brief Find the length of the track (in milliseconds)
*
* \param filename The filename for which we want to find the length.
* \returns An integer (signed!) to represent the length in milliseconds.
*/
int MetaIOTagLib::getTrackLength(const QString &filename)
std::chrono::milliseconds MetaIOTagLib::getTrackLength(const QString &filename)
{
int milliseconds = 0;
std::chrono::milliseconds milliseconds = 0ms;
QByteArray fname = filename.toLocal8Bit();
auto *file = new TagLib::FileRef(fname.constData());

if (file && file->audioProperties())
milliseconds = file->audioProperties()->length() * 1000;
milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());

This comment has been minimized.

Copy link
@warpme

warpme Jan 26, 2021

Contributor

This change makes compilation failing for me with error:

metaiotaglib.cpp:112:75: error: ‘class TagLib::AudioProperties’ has no member named ‘lengthInMilliseconds’
112 | milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());
| ^~~~~~~~~~~~~~~~~~~~
In file included from metaioid3.h:9,
from metaio.cpp:11:


// If we didn't get a valid length, add the metadata but show warning.
if (milliseconds <= 1000)
if (milliseconds <= 1s)
{
LOG(VB_GENERAL, LOG_ERR,
QString("MetaIOTagLib: Failed to read length "
Expand Down
4 changes: 2 additions & 2 deletions mythtv/libs/libmythmetadata/metaiotaglib.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ class META_PUBLIC MetaIOTagLib : public MetaIO
MusicMetadata* read(const QString &filename) override = 0; // MetaIO

protected:
static int getTrackLength(TagLib::File *file);
int getTrackLength(const QString &filename) override; // MetaIO
static std::chrono::milliseconds getTrackLength(TagLib::File *file);
std::chrono::milliseconds getTrackLength(const QString &filename) override; // MetaIO
void ReadGenericMetadata(TagLib::Tag *tag, MusicMetadata *metadata);
static void WriteGenericMetadata(TagLib::Tag *tag, const MusicMetadata *metadata);
};
Expand Down
2 changes: 1 addition & 1 deletion mythtv/libs/libmythmetadata/metaiowavpack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ MusicMetadata* MetaIOWavPack::read(const QString &filename)

metadata->setCompilation(compilation);

if (metadata->Length() <= 0)
if (metadata->Length() <= 0ms)
metadata->setLength(getTrackLength(wpfile));

delete wpfile;
Expand Down
12 changes: 6 additions & 6 deletions mythtv/libs/libmythmetadata/musicmetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ MusicMetadata *MusicMetadata::createFromID(int trackid)
mdata->m_genre = query.value(4).toString();
mdata->m_year = query.value(5).toInt();
mdata->m_trackNum = query.value(6).toInt();
mdata->m_length = query.value(7).toInt();
mdata->m_length = std::chrono::milliseconds(query.value(7).toInt());
mdata->m_id = query.value(8).toUInt();
mdata->m_rating = query.value(9).toInt();
mdata->m_playCount = query.value(10).toInt();
Expand Down Expand Up @@ -743,7 +743,7 @@ void MusicMetadata::dumpToDatabase()
query.bindValue(":GENRE", m_genreId);
query.bindValue(":YEAR", m_year);
query.bindValue(":TRACKNUM", m_trackNum);
query.bindValue(":LENGTH", m_length);
query.bindValue(":LENGTH", static_cast<qint64>(m_length.count()));
query.bindValue(":FILENAME", sqlfilename);
query.bindValue(":RATING", m_rating);
query.bindValueNoNull(":FORMAT", m_format);
Expand Down Expand Up @@ -1060,7 +1060,7 @@ void MusicMetadata::setField(const QString &field, const QString &data)
else if (field == "disccount")
m_discCount = data.toInt();
else if (field == "length")
m_length = data.toInt();
m_length = std::chrono::milliseconds(data.toInt());
else if (field == "compilation")
m_compilation = (data.toInt() > 0);
else
Expand Down Expand Up @@ -1116,8 +1116,8 @@ void MusicMetadata::toMap(InfoMap &metadataMap, const QString &prefix)
metadataMap[prefix + "genre"] = m_genre;
metadataMap[prefix + "year"] = (m_year > 0 ? QString("%1").arg(m_year) : "");

QString fmt = (m_length >= ONEHOURINMS) ? "H:mm:ss" : "mm:ss";
metadataMap[prefix + "length"] = MythFormatTimeMs(m_length, fmt);
QString fmt = (m_length >= 1h) ? "H:mm:ss" : "mm:ss";
metadataMap[prefix + "length"] = MythFormatTimeMs(m_length.count(), fmt);

if (m_lastPlay.isValid())
{
Expand Down Expand Up @@ -1532,7 +1532,7 @@ void AllMusic::resync()
query.value(7).toString(), // genre
query.value(8).toInt(), // year
query.value(9).toInt(), // track no.
query.value(10).toInt(), // length
std::chrono::milliseconds(query.value(10).toInt()), // length
query.value(0).toInt(), // id
query.value(13).toInt(), // rating
query.value(14).toInt(), // playcount
Expand Down
10 changes: 6 additions & 4 deletions mythtv/libs/libmythmetadata/musicmetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class META_PUBLIC MusicMetadata

explicit MusicMetadata(QString lfilename = "", QString lartist = "", QString lcompilation_artist = "",
QString lalbum = "", QString ltitle = "", QString lgenre = "",
int lyear = 0, int ltracknum = 0, int llength = 0, int lid = 0,
int lyear = 0, int ltracknum = 0, std::chrono::milliseconds llength = 0ms, int lid = 0,
int lrating = 0, int lplaycount = 0, QDateTime llastplay = QDateTime(),
QDateTime ldateadded = QDateTime(), bool lcompilation = false, QString lformat = "")
: m_artist(std::move(lartist)),
Expand Down Expand Up @@ -202,8 +202,10 @@ class META_PUBLIC MusicMetadata
int GetTrackCount() const { return m_trackCount; }
void setTrackCount(int ltrackcount) { m_trackCount = ltrackcount; }

int Length() const { return m_length; }
void setLength(int llength) { m_length = llength; }
std::chrono::milliseconds Length() const { return m_length; }
template <typename T>
typename std::enable_if_t<std::chrono::__is_duration<T>::value, void>
setLength(T llength) { m_length = llength; }

int DiscNumber() const {return m_discNum;}
void setDiscNumber(int discnum) { m_discNum = discnum; }
Expand Down Expand Up @@ -339,7 +341,7 @@ class META_PUBLIC MusicMetadata
int m_trackCount {0};
int m_discNum {0};
int m_discCount {0};
int m_length {0};
std::chrono::milliseconds m_length {0ms};
int m_rating {0};
int m_directoryId {-1};
int m_artistId {-1};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test_musicmetadata
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
/*
* Class TestMusicMetadata
*
* Copyright (c) David Hampton 2021
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "test_musicmetadata.h"

void TestMusicMetadata::initTestCase()
{
gCoreContext = new MythCoreContext("test_mythmusicdata_1.0", nullptr);

QDir::setCurrent("libmythmetadata/test/test_musicmetadata");
}

void TestMusicMetadata::dump(MusicMetadata *data)
{
std::cerr << "Artist: " << qPrintable(data->Artist()) << std::endl;
std::cerr << "Artist Sort: " << qPrintable(data->ArtistSort()) << std::endl;
std::cerr << "Compilation Artrist: " << qPrintable(data->CompilationArtist()) << std::endl;
std::cerr << "Compilation Artrist Sort: " << qPrintable(data->CompilationArtistSort()) << std::endl;
std::cerr << "Album: " << qPrintable(data->Album()) << std::endl;
std::cerr << "Album Sort: " << qPrintable(data->AlbumSort()) << std::endl;
std::cerr << "Title: " << qPrintable(data->Title()) << std::endl;
std::cerr << "Title Sort: " << qPrintable(data->TitleSort()) << std::endl;
std::cerr << "Format Artist: " << qPrintable(data->FormatArtist()) << std::endl;
std::cerr << "Format Title: " << qPrintable(data->FormatTitle()) << std::endl;
std::cerr << "Genre: " << qPrintable(data->Genre()) << std::endl;
std::cerr << "Directory Id: " << data->getDirectoryId() << std::endl;
std::cerr << "Artist Id: " << data->getArtistId() << std::endl;
std::cerr << "Compilation Artist Id: " << data->getCompilationArtistId() << std::endl;
std::cerr << "Album Id: " << data->getArtistId() << std::endl;
std::cerr << "Genre Id: " << data->getGenreId() << std::endl;
std::cerr << "Year: " << data->Year() << std::endl;
std::cerr << "Track: " << data->Track() << std::endl;
std::cerr << "Track Count: " << data->GetTrackCount() << std::endl;
std::cerr << "Length: " << data->Length().count() << std::endl;
std::cerr << "Disc Number: " << data->DiscNumber() << std::endl;
std::cerr << "Disc Count: " << data->DiscCount() << std::endl;
std::cerr << "Play Count: " << data->PlayCount() << std::endl;
std::cerr << "Id: " << data->ID() << std::endl;
std::cerr << "Filename: " << qPrintable(data->Filename()) << std::endl;
std::cerr << "Hostname: " << qPrintable(data->Hostname()) << std::endl;
std::cerr << "File Size: " << data->FileSize() << std::endl;
std::cerr << "Format: " << qPrintable(data->Format()) << std::endl;
std::cerr << "Rating: " << data->Rating() << std::endl;
std::cerr << "LastPlay: " << qPrintable(data->LastPlay().toString(Qt::ISODate)) << std::endl;
std::cerr << "Compilation: " << (data->Compilation() ? "true" : "false") << std::endl;
}

void TestMusicMetadata::test_flac(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.flac");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 5000ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
QCOMPARE(data->Artist(), QString("Mother Nature"));
QCOMPARE(data->ArtistSort(), QString("mother nature"));
QCOMPARE(data->Track(), 123);
QCOMPARE(data->GetTrackCount(), 999999999);
QCOMPARE(data->Year(), 2021);
}

void TestMusicMetadata::test_ogg(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.ogg");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 5000ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
QCOMPARE(data->Artist(), QString("Mother Nature"));
QCOMPARE(data->ArtistSort(), QString("mother nature"));
QCOMPARE(data->Track(), 123);
// metaiooggvorbis doesn't read track count
// QCOMPARE(data->GetTrackCount(), 999999999);
QCOMPARE(data->Year(), 2021);
}

void TestMusicMetadata::test_mp4(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.m4a");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 3165ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
QCOMPARE(data->Artist(), QString("Mother Nature"));
QCOMPARE(data->ArtistSort(), QString("mother nature"));

// metaiomp4 doesn't seem to read track counts
// QCOMPARE(data->Track(), 123);
// QCOMPARE(data->GetTrackCount(), 999999999);

// metaiomp4 doesn't seem to read year
// QCOMPARE(data->Year(), 2021);
}

void TestMusicMetadata::test_mp3(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.mp3");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 5042ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
QCOMPARE(data->Artist(), QString("Mother Nature"));
QCOMPARE(data->ArtistSort(), QString("mother nature"));
QCOMPARE(data->Track(), 123);
QCOMPARE(data->GetTrackCount(), 999999999);
QCOMPARE(data->Year(), 2021);
}

void TestMusicMetadata::test_wv(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.wv");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 3142ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
QCOMPARE(data->Artist(), QString("Mother Nature"));
QCOMPARE(data->ArtistSort(), QString("mother nature"));
QCOMPARE(data->Track(), 123);
// metaiowavpack doesn't read track count
// QCOMPARE(data->GetTrackCount(), 999999999);
QCOMPARE(data->Year(), 2021);
}

// Exercises metaioavfcomment.cpp
void TestMusicMetadata::test_aiff(void)
{
MusicMetadata *data = MetaIO::readMetadata("samples/silence.aiff");
QVERIFY(data != nullptr);
// dump(data);
QCOMPARE(data->Length(), 2000ms);
QCOMPARE(data->Title(), QString("The Silence, #99"));
QCOMPARE(data->TitleSort(), QString("silence, #99"));
}

void TestMusicMetadata::cleanupTestCase()
{
}

QTEST_APPLESS_MAIN(TestMusicMetadata)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Class TestMusicMetadata
*
* Copyright (c) David Hampton 2021
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include <QtTest/QtTest>
#include <iostream>
#include "metaio.h"
#include "mythcorecontext.h"

class TestMusicMetadata : public QObject
{
Q_OBJECT

private slots:
static void initTestCase();
static void dump(MusicMetadata *data);
static void test_flac(void);
static void test_ogg(void);
static void test_mp4(void);
static void test_mp3(void);
static void test_wv(void);
static void test_aiff(void);
static void cleanupTestCase();
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
include ( ../../../../settings.pro )
include ( ../../../../test.pro )

QT += sql network testlib widgets

TEMPLATE = app
TARGET = test_musicmetadata
DEPENDPATH += . ../..
INCLUDEPATH += . ../.. ../../../libmythbase

# Add all the necessary libraries
LIBS += -L../../../libmythbase -lmythbase-$$LIBVERSION
LIBS += -L../../../libmythui -lmythui-$$LIBVERSION
LIBS += -L../../../libmythupnp -lmythupnp-$$LIBVERSION
LIBS += -L../../../libmythservicecontracts -lmythservicecontracts-$$LIBVERSION
LIBS += -L../../../libmythtv -lmythtv-$$LIBVERSION
LIBS += -L../../../libmyth -lmyth-$$LIBVERSION
LIBS += -L../../../../external/FFmpeg/libavcodec -lmythavcodec
LIBS += -L../../../../external/FFmpeg/libswscale -lmythswscale
LIBS += -L../../../../external/FFmpeg/libavformat -lmythavformat
LIBS += -L../../../../external/FFmpeg/libavutil -lmythavutil
LIBS += -L../../../../external/FFmpeg/libswresample -lmythswresample
LIBS += -L../../../../external/FFmpeg/libavfilter -lmythavfilter
LIBS += -L../../../../external/FFmpeg/libpostproc -lmythpostproc
LIBS += -L../.. -lmythmetadata-$$LIBVERSION


using_exiv2_external {
LIBS += -lexiv2
} else {
LIBS += -L../../../../external/libexiv2 -lmythexiv2-0.28
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/libexiv2
}

QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libavutil
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libswscale
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libavformat
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libavcodec
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libavfilter
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libpostproc
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../../external/FFmpeg/libswresample
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythbase
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmyth
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythtv
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythui
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythupnp
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythservicecontracts
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythfreemheg
QMAKE_LFLAGS += -Wl,$$_RPATH_$(PWD)/../../../libmythmetadata

# Input
HEADERS += test_musicmetadata.h
SOURCES += test_musicmetadata.cpp

QMAKE_CLEAN += $(TARGET)
QMAKE_CLEAN += ; ( cd $(OBJECTS_DIR) && rm -f *.gcov *.gcda *.gcno )

LIBS += $$EXTRA_LIBS $$LATE_LIBS

# Fix runtime linking
linux:QMAKE_LFLAGS += -Wl,--disable-new-dtags
2 changes: 1 addition & 1 deletion mythtv/programs/mythbackend/services/serviceUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ void FillMusicMetadataInfo (DTC::MusicMetadataInfo *pVideoMetadataInfo,
pVideoMetadataInfo->setGenre(pMetadata->Genre());
pVideoMetadataInfo->setYear(pMetadata->Year());
pVideoMetadataInfo->setPlayCount(pMetadata->PlayCount());
pVideoMetadataInfo->setLength(pMetadata->Length());
pVideoMetadataInfo->setLength(pMetadata->Length().count());
pVideoMetadataInfo->setRating(pMetadata->Rating());
pVideoMetadataInfo->setFileName(pMetadata->Filename());
pVideoMetadataInfo->setHostName(pMetadata->Hostname());
Expand Down
14 changes: 8 additions & 6 deletions mythtv/programs/mythutil/musicmetautils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "storagegroup.h"
#include "musicmetadata.h"
#include "metaio.h"
#include "mythchrono.h"
#include "mythcontext.h"
#include "musicfilescanner.h"
#include "musicutils.h"
Expand Down Expand Up @@ -266,7 +267,7 @@ static int CalcTrackLength(const MythUtilCommandLineParser &cmdline)
return GENERIC_EXIT_NOT_OK;;
}

int duration = 0;
std::chrono::seconds duration = 0s;
long long time = 0;

for (uint i = 0; i < inputFC->nb_streams; i++)
Expand Down Expand Up @@ -302,7 +303,7 @@ static int CalcTrackLength(const MythUtilCommandLineParser &cmdline)
av_packet_unref(&pkt);
}

duration = time * av_q2d(inputFC->streams[i]->time_base);
duration = secondsFromFloat(time * av_q2d(inputFC->streams[i]->time_base));
break;
}

Expand All @@ -319,13 +320,14 @@ static int CalcTrackLength(const MythUtilCommandLineParser &cmdline)
avformat_close_input(&inputFC);
inputFC = nullptr;

if (mdata->Length() / 1000 != duration)
std::chrono::seconds dbLength = duration_cast<std::chrono::seconds>(mdata->Length());
if (dbLength != duration)
{
LOG(VB_GENERAL, LOG_INFO, QString("The length of this track in the database was %1s "
"it is now %2s").arg(mdata->Length() / 1000).arg(duration));
"it is now %2s").arg(dbLength.count()).arg(duration.count()));

// update the track length in the database
mdata->setLength(duration * 1000);
mdata->setLength(duration);
mdata->dumpToDatabase();

// tell any clients that the metadata for this track has changed
Expand All @@ -334,7 +336,7 @@ static int CalcTrackLength(const MythUtilCommandLineParser &cmdline)
else
{
LOG(VB_GENERAL, LOG_INFO, QString("The length of this track is unchanged %1s")
.arg(mdata->Length() / 1000));
.arg(dbLength.count()));
}

return GENERIC_EXIT_OK;
Expand Down