annotate audio/AudioRecordTarget.cpp @ 496:4f1d280903ad tony-2.0-integration

Update analysis stuff when recording starts (and when model is added) rather than when it ends. Not continuing to update during recording though...
author Chris Cannam
date Mon, 12 Oct 2015 17:10:43 +0100
parents 2f5ffd36879b
children d1c70c680fa9 dcd2afbc1bb7
rev   line source
Chris@476 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@476 2
Chris@476 3 /*
Chris@476 4 Sonic Visualiser
Chris@476 5 An audio file viewer and annotation editor.
Chris@476 6 Centre for Digital Music, Queen Mary, University of London.
Chris@476 7
Chris@476 8 This program is free software; you can redistribute it and/or
Chris@476 9 modify it under the terms of the GNU General Public License as
Chris@476 10 published by the Free Software Foundation; either version 2 of the
Chris@476 11 License, or (at your option) any later version. See the file
Chris@476 12 COPYING included with this distribution for more information.
Chris@476 13 */
Chris@476 14
Chris@476 15 #include "AudioRecordTarget.h"
Chris@476 16
Chris@476 17 #include "base/ViewManagerBase.h"
Chris@476 18 #include "base/TempDirectory.h"
Chris@476 19
Chris@477 20 #include "data/model/WritableWaveFileModel.h"
Chris@476 21
Chris@476 22 #include <QDir>
Chris@476 23
Chris@476 24 AudioRecordTarget::AudioRecordTarget(ViewManagerBase *manager,
Chris@476 25 QString clientName) :
Chris@476 26 m_viewManager(manager),
Chris@476 27 m_clientName(clientName.toUtf8().data()),
Chris@476 28 m_recording(false),
Chris@476 29 m_recordSampleRate(44100),
Chris@485 30 m_frameCount(0),
Chris@477 31 m_model(0)
Chris@476 32 {
Chris@476 33 }
Chris@476 34
Chris@476 35 AudioRecordTarget::~AudioRecordTarget()
Chris@476 36 {
Chris@476 37 QMutexLocker locker(&m_mutex);
Chris@476 38 }
Chris@476 39
Chris@476 40 void
Chris@491 41 AudioRecordTarget::setSystemRecordBlockSize(int)
Chris@476 42 {
Chris@476 43 }
Chris@476 44
Chris@476 45 void
Chris@476 46 AudioRecordTarget::setSystemRecordSampleRate(int n)
Chris@476 47 {
Chris@476 48 m_recordSampleRate = n;
Chris@476 49 }
Chris@476 50
Chris@476 51 void
Chris@491 52 AudioRecordTarget::setSystemRecordLatency(int)
Chris@476 53 {
Chris@476 54 }
Chris@476 55
Chris@476 56 void
Chris@476 57 AudioRecordTarget::putSamples(int nframes, float **samples)
Chris@476 58 {
Chris@485 59 bool secChanged = false;
Chris@485 60 sv_frame_t frameToEmit = 0;
Chris@485 61
Chris@485 62 {
Chris@485 63 QMutexLocker locker(&m_mutex); //!!! bad here
Chris@485 64 if (!m_recording) return;
Chris@485 65
Chris@485 66 m_model->addSamples(samples, nframes);
Chris@485 67
Chris@485 68 sv_frame_t priorFrameCount = m_frameCount;
Chris@485 69 m_frameCount += nframes;
Chris@485 70
Chris@485 71 RealTime priorRT = RealTime::frame2RealTime
Chris@485 72 (priorFrameCount, m_recordSampleRate);
Chris@485 73 RealTime postRT = RealTime::frame2RealTime
Chris@485 74 (m_frameCount, m_recordSampleRate);
Chris@485 75
Chris@485 76 secChanged = (postRT.sec > priorRT.sec);
Chris@485 77 if (secChanged) frameToEmit = m_frameCount;
Chris@485 78 }
Chris@485 79
Chris@485 80 if (secChanged) {
Chris@485 81 emit recordDurationChanged(frameToEmit, m_recordSampleRate);
Chris@485 82 }
Chris@476 83 }
Chris@476 84
Chris@476 85 void
Chris@491 86 AudioRecordTarget::setInputLevels(float, float)
Chris@476 87 {
Chris@476 88 }
Chris@476 89
Chris@477 90 void
Chris@477 91 AudioRecordTarget::modelAboutToBeDeleted()
Chris@477 92 {
Chris@477 93 QMutexLocker locker(&m_mutex);
Chris@477 94 if (sender() == m_model) {
Chris@477 95 m_model = 0;
Chris@477 96 m_recording = false;
Chris@477 97 }
Chris@477 98 }
Chris@477 99
Chris@483 100 QString
Chris@483 101 AudioRecordTarget::getRecordFolder()
Chris@483 102 {
Chris@483 103 QDir parent(TempDirectory::getInstance()->getContainingPath());
Chris@483 104 QString subdirname = "recorded"; //!!! tr?
Chris@483 105 if (!parent.mkpath(subdirname)) {
Chris@483 106 cerr << "ERROR: AudioRecordTarget::getRecordFolder: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl;
Chris@483 107 return "";
Chris@483 108 } else {
Chris@483 109 return parent.filePath(subdirname);
Chris@483 110 }
Chris@483 111 }
Chris@483 112
Chris@477 113 WritableWaveFileModel *
Chris@476 114 AudioRecordTarget::startRecording()
Chris@476 115 {
Chris@477 116 {
Chris@476 117 QMutexLocker locker(&m_mutex);
Chris@476 118 if (m_recording) {
Chris@476 119 cerr << "WARNING: AudioRecordTarget::startRecording: We are already recording" << endl;
Chris@477 120 return 0;
Chris@476 121 }
Chris@476 122
Chris@477 123 m_model = 0;
Chris@485 124 m_frameCount = 0;
Chris@477 125
Chris@483 126 QString folder = getRecordFolder();
Chris@483 127 if (folder == "") return 0;
Chris@483 128 QDir recordedDir(folder);
Chris@476 129
Chris@480 130 QDateTime now = QDateTime::currentDateTime();
Chris@476 131
Chris@480 132 // Don't use QDateTime::toString(Qt::ISODate) as the ":" character
Chris@480 133 // isn't permitted in filenames on Windows
Chris@480 134 QString filename = QString("recorded-%1.wav")
Chris@480 135 .arg(now.toString("yyyyMMdd-HHmmss-zzz"));
Chris@476 136
Chris@476 137 m_audioFileName = recordedDir.filePath(filename);
Chris@476 138
Chris@477 139 m_model = new WritableWaveFileModel(m_recordSampleRate, 2, m_audioFileName);
Chris@477 140
Chris@477 141 if (!m_model->isOK()) {
Chris@477 142 cerr << "ERROR: AudioRecordTarget::startRecording: Recording failed"
Chris@477 143 << endl;
Chris@476 144 //!!! and throw?
Chris@477 145 delete m_model;
Chris@477 146 m_model = 0;
Chris@477 147 return 0;
Chris@476 148 }
Chris@476 149
Chris@476 150 m_recording = true;
Chris@477 151 }
Chris@477 152
Chris@477 153 emit recordStatusChanged(true);
Chris@477 154 return m_model;
Chris@476 155 }
Chris@476 156
Chris@476 157 void
Chris@476 158 AudioRecordTarget::stopRecording()
Chris@476 159 {
Chris@477 160 {
Chris@476 161 QMutexLocker locker(&m_mutex);
Chris@476 162 if (!m_recording) {
Chris@476 163 cerr << "WARNING: AudioRecordTarget::startRecording: Not recording" << endl;
Chris@476 164 return;
Chris@476 165 }
Chris@476 166
Chris@477 167 m_model->setCompletion(100);
Chris@477 168 m_model = 0;
Chris@476 169 m_recording = false;
Chris@477 170 }
Chris@477 171
Chris@477 172 emit recordStatusChanged(false);
Chris@476 173 }
Chris@476 174
Chris@476 175