annotate base/Debug.cpp @ 1288:5ef9b4d4bbdb 3.0-integration

Filter out Xing/LAME info frames, rather than letting them go to the mp3 decoder as if they were audio frames. Fixes the 1152-sample zero pad at start of some decoded mp3 files (distinct from decoder delay). The logic here is based on the madplay code.
author Chris Cannam
date Thu, 24 Nov 2016 13:32:04 +0000
parents ad2d3e0a8b7c
children 838a45cff62d
rev   line source
Chris@685 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@685 2
Chris@685 3 /*
Chris@685 4 Sonic Visualiser
Chris@685 5 An audio file viewer and annotation editor.
Chris@685 6 Centre for Digital Music, Queen Mary, University of London.
Chris@685 7 This file copyright 2010-2011 Chris Cannam and QMUL.
Chris@685 8
Chris@685 9 This program is free software; you can redistribute it and/or
Chris@685 10 modify it under the terms of the GNU General Public License as
Chris@685 11 published by the Free Software Foundation; either version 2 of the
Chris@685 12 License, or (at your option) any later version. See the file
Chris@685 13 COPYING included with this distribution for more information.
Chris@685 14 */
Chris@685 15
Chris@685 16 #include "Debug.h"
Chris@685 17 #include "ResourceFinder.h"
Chris@685 18
Chris@1061 19 #include <QMutex>
Chris@1061 20 #include <QDir>
Chris@685 21 #include <QUrl>
Chris@685 22 #include <QCoreApplication>
Chris@685 23
Chris@1247 24 #include <stdexcept>
Chris@685 25
Chris@1275 26 static SVDebug *svdebug = 0;
Chris@1275 27 static SVCerr *svcerr = 0;
Chris@950 28 static QMutex mutex;
Chris@950 29
Chris@1061 30 SVDebug &getSVDebug() {
Chris@1061 31 mutex.lock();
Chris@1275 32 if (!svdebug) {
Chris@1275 33 svdebug = new SVDebug();
Chris@1061 34 }
Chris@1061 35 mutex.unlock();
Chris@1275 36 return *svdebug;
Chris@1061 37 }
Chris@1061 38
Chris@1275 39 SVCerr &getSVCerr() {
Chris@1275 40 mutex.lock();
Chris@1275 41 if (!svcerr) {
Chris@1275 42 if (!svdebug) {
Chris@1275 43 svdebug = new SVDebug();
Chris@1275 44 }
Chris@1275 45 svcerr = new SVCerr(*svdebug);
Chris@1275 46 }
Chris@1275 47 mutex.unlock();
Chris@1275 48 return *svcerr;
Chris@1275 49 }
Chris@1275 50
Chris@1275 51 bool SVDebug::m_silenced = false;
Chris@1275 52 bool SVCerr::m_silenced = false;
Chris@1275 53
Chris@1061 54 SVDebug::SVDebug() :
Chris@1061 55 m_prefix(0),
Chris@1061 56 m_ok(false),
Chris@1275 57 m_eol(true)
Chris@685 58 {
Chris@1275 59 if (m_silenced) return;
Chris@1275 60
Chris@1247 61 if (qApp->applicationName() == "") {
Chris@1247 62 cerr << "ERROR: Can't use SVDEBUG before setting application name" << endl;
Chris@1247 63 throw std::logic_error("Can't use SVDEBUG before setting application name");
Chris@1247 64 }
Chris@1247 65
Chris@951 66 QString pfx = ResourceFinder().getUserResourcePrefix();
Chris@951 67 QDir logdir(QString("%1/%2").arg(pfx).arg("log"));
Chris@951 68
Chris@1061 69 m_prefix = strdup(QString("[%1]")
Chris@1061 70 .arg(QCoreApplication::applicationPid())
Chris@1061 71 .toLatin1().data());
Chris@951 72
Chris@1058 73 //!!! what to do if mkpath fails?
Chris@1058 74 if (!logdir.exists()) logdir.mkpath(logdir.path());
Chris@1058 75
Chris@1061 76 QString fileName = logdir.path() + "/sv-debug.log";
Chris@1061 77
Chris@1061 78 m_stream.open(fileName.toLocal8Bit().data(), std::ios_base::out);
Chris@1061 79
Chris@1061 80 if (!m_stream) {
Chris@1061 81 QDebug(QtWarningMsg) << (const char *)m_prefix
Chris@1061 82 << "Failed to open debug log file "
Chris@1061 83 << fileName << " for writing";
Chris@951 84 } else {
Chris@1061 85 cerr << m_prefix << ": Log file is " << fileName << endl;
Chris@1061 86 m_ok = true;
Chris@685 87 }
Chris@1061 88 }
Chris@685 89
Chris@1061 90 SVDebug::~SVDebug()
Chris@1061 91 {
Chris@1275 92 if (m_stream) m_stream.close();
Chris@685 93 }
Chris@685 94
Chris@685 95 QDebug &
Chris@685 96 operator<<(QDebug &dbg, const std::string &s)
Chris@685 97 {
Chris@685 98 dbg << QString::fromUtf8(s.c_str());
Chris@685 99 return dbg;
Chris@685 100 }
Chris@685 101
Chris@685 102 std::ostream &
Chris@685 103 operator<<(std::ostream &target, const QString &str)
Chris@685 104 {
Chris@846 105 return target << str.toStdString();
Chris@685 106 }
Chris@685 107
Chris@685 108 std::ostream &
Chris@685 109 operator<<(std::ostream &target, const QUrl &u)
Chris@685 110 {
Chris@846 111 return target << "<" << u.toString().toStdString() << ">";
Chris@685 112 }
Chris@685 113