comparison audio/AudioRecordTarget.cpp @ 477:411e019474e5 recording

OK, we can record -- sort of
author Chris Cannam
date Tue, 18 Aug 2015 16:47:54 +0100
parents f4d1fa41b94b
children 1d4cb8befcfd
comparison
equal deleted inserted replaced
476:f4d1fa41b94b 477:411e019474e5
15 #include "AudioRecordTarget.h" 15 #include "AudioRecordTarget.h"
16 16
17 #include "base/ViewManagerBase.h" 17 #include "base/ViewManagerBase.h"
18 #include "base/TempDirectory.h" 18 #include "base/TempDirectory.h"
19 19
20 #include "data/fileio/WavFileWriter.h" 20 #include "data/model/WritableWaveFileModel.h"
21 21
22 #include <QDir> 22 #include <QDir>
23 23
24 AudioRecordTarget::AudioRecordTarget(ViewManagerBase *manager, 24 AudioRecordTarget::AudioRecordTarget(ViewManagerBase *manager,
25 QString clientName) : 25 QString clientName) :
26 m_viewManager(manager), 26 m_viewManager(manager),
27 m_clientName(clientName.toUtf8().data()), 27 m_clientName(clientName.toUtf8().data()),
28 m_recording(false), 28 m_recording(false),
29 m_recordSampleRate(44100), 29 m_recordSampleRate(44100),
30 m_writer(0) 30 m_model(0)
31 { 31 {
32 } 32 }
33 33
34 AudioRecordTarget::~AudioRecordTarget() 34 AudioRecordTarget::~AudioRecordTarget()
35 { 35 {
36 QMutexLocker locker(&m_mutex); 36 QMutexLocker locker(&m_mutex);
37 delete m_writer;
38 } 37 }
39 38
40 void 39 void
41 AudioRecordTarget::setSystemRecordBlockSize(int sz) 40 AudioRecordTarget::setSystemRecordBlockSize(int sz)
42 { 41 {
56 void 55 void
57 AudioRecordTarget::putSamples(int nframes, float **samples) 56 AudioRecordTarget::putSamples(int nframes, float **samples)
58 { 57 {
59 QMutexLocker locker(&m_mutex); //!!! bad here 58 QMutexLocker locker(&m_mutex); //!!! bad here
60 if (!m_recording) return; 59 if (!m_recording) return;
61 m_writer->writeSamples(samples, nframes); 60 m_model->addSamples(samples, nframes);
62 } 61 }
63 62
64 void 63 void
65 AudioRecordTarget::setInputLevels(float peakLeft, float peakRight) 64 AudioRecordTarget::setInputLevels(float peakLeft, float peakRight)
66 { 65 {
67 } 66 }
68 67
69 QString 68 void
69 AudioRecordTarget::modelAboutToBeDeleted()
70 {
71 QMutexLocker locker(&m_mutex);
72 if (sender() == m_model) {
73 m_model = 0;
74 m_recording = false;
75 }
76 }
77
78 WritableWaveFileModel *
70 AudioRecordTarget::startRecording() 79 AudioRecordTarget::startRecording()
71 { 80 {
81 {
72 QMutexLocker locker(&m_mutex); 82 QMutexLocker locker(&m_mutex);
73 if (m_recording) { 83 if (m_recording) {
74 cerr << "WARNING: AudioRecordTarget::startRecording: We are already recording" << endl; 84 cerr << "WARNING: AudioRecordTarget::startRecording: We are already recording" << endl;
75 return ""; 85 return 0;
76 } 86 }
87
88 m_model = 0;
77 89
78 QDir parent(TempDirectory::getInstance()->getContainingPath()); 90 QDir parent(TempDirectory::getInstance()->getContainingPath());
79 QDir recordedDir; 91 QDir recordedDir;
80 QString subdirname = "recorded"; //!!! tr? 92 QString subdirname = "recorded"; //!!! tr?
81 if (!parent.mkpath(subdirname)) { 93 if (!parent.mkpath(subdirname)) {
82 cerr << "ERROR: AudioRecordTarget::startRecording: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl; 94 cerr << "ERROR: AudioRecordTarget::startRecording: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl;
83 return ""; 95 return 0;
84 } else { 96 } else {
85 recordedDir = parent.filePath(subdirname); 97 recordedDir = parent.filePath(subdirname);
86 } 98 }
87 99
88 //!!! todo proper temp name as in TempDirectory 100 //!!! todo proper temp name as in TempDirectory
89 101
90 QString filename = "recorded.wav"; //!!! 102 QString filename = "recorded.wav"; //!!!
91 103
92 m_audioFileName = recordedDir.filePath(filename); 104 m_audioFileName = recordedDir.filePath(filename);
93
94 m_writer = new WavFileWriter(m_audioFileName,
95 m_recordSampleRate,
96 2,
97 WavFileWriter::WriteToTarget);
98 105
99 if (!m_writer->isOK()) { 106 m_model = new WritableWaveFileModel(m_recordSampleRate, 2, m_audioFileName);
100 cerr << "ERROR: AudioRecordTarget::startRecording: Recording failed: " 107
101 << m_writer->getError() << endl; 108 if (!m_model->isOK()) {
109 cerr << "ERROR: AudioRecordTarget::startRecording: Recording failed"
110 << endl;
102 //!!! and throw? 111 //!!! and throw?
103 delete m_writer; 112 delete m_model;
104 return ""; 113 m_model = 0;
114 return 0;
105 } 115 }
106 116
107 m_recording = true; 117 m_recording = true;
108 118 }
109 return m_audioFileName; 119
120 emit recordStatusChanged(true);
121 return m_model;
110 } 122 }
111 123
112 void 124 void
113 AudioRecordTarget::stopRecording() 125 AudioRecordTarget::stopRecording()
114 { 126 {
127 {
115 QMutexLocker locker(&m_mutex); 128 QMutexLocker locker(&m_mutex);
116 if (!m_recording) { 129 if (!m_recording) {
117 cerr << "WARNING: AudioRecordTarget::startRecording: Not recording" << endl; 130 cerr << "WARNING: AudioRecordTarget::startRecording: Not recording" << endl;
118 return; 131 return;
119 } 132 }
120 133
121 m_writer->close(); 134 m_model->setCompletion(100);
122 delete m_writer; 135 m_model = 0;
123 m_recording = false; 136 m_recording = false;
137 }
138
139 emit recordStatusChanged(false);
124 } 140 }
125 141
126 142