Mercurial > hg > svapp
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 |