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@574
|
15 #ifndef SV_AUDIO_CALLBACK_RECORD_TARGET_H
|
Chris@574
|
16 #define SV_AUDIO_CALLBACK_RECORD_TARGET_H
|
Chris@574
|
17
|
Chris@574
|
18 #include "base/AudioRecordTarget.h"
|
Chris@476
|
19
|
Chris@476
|
20 #include <bqaudioio/ApplicationRecordTarget.h>
|
Chris@476
|
21
|
Chris@476
|
22 #include <string>
|
Chris@575
|
23 #include <atomic>
|
Chris@476
|
24
|
Chris@476
|
25 #include <QObject>
|
Chris@476
|
26 #include <QMutex>
|
Chris@476
|
27
|
Chris@476
|
28 #include "base/BaseTypes.h"
|
Chris@575
|
29 #include "base/RingBuffer.h"
|
Chris@476
|
30
|
Chris@476
|
31 class ViewManagerBase;
|
Chris@477
|
32 class WritableWaveFileModel;
|
Chris@476
|
33
|
Chris@574
|
34 class AudioCallbackRecordTarget : public QObject,
|
Chris@574
|
35 public AudioRecordTarget,
|
Chris@574
|
36 public breakfastquay::ApplicationRecordTarget
|
Chris@476
|
37 {
|
Chris@476
|
38 Q_OBJECT
|
Chris@476
|
39
|
Chris@476
|
40 public:
|
Chris@574
|
41 AudioCallbackRecordTarget(ViewManagerBase *, QString clientName);
|
Chris@574
|
42 virtual ~AudioCallbackRecordTarget();
|
Chris@476
|
43
|
Chris@559
|
44 virtual std::string getClientName() const override { return m_clientName; }
|
Chris@476
|
45
|
Chris@559
|
46 virtual int getApplicationSampleRate() const override;
|
Chris@559
|
47 virtual int getApplicationChannelCount() const override;
|
Chris@476
|
48
|
Chris@559
|
49 virtual void setSystemRecordBlockSize(int) override;
|
Chris@559
|
50 virtual void setSystemRecordSampleRate(int) override;
|
Chris@559
|
51 virtual void setSystemRecordLatency(int) override;
|
Chris@559
|
52 virtual void setSystemRecordChannelCount(int) override;
|
Chris@476
|
53
|
Chris@559
|
54 virtual void putSamples(const float *const *samples, int nchannels, int nframes) override;
|
Chris@476
|
55
|
Chris@559
|
56 virtual void setInputLevels(float peakLeft, float peakRight) override;
|
Chris@476
|
57
|
Chris@559
|
58 virtual void audioProcessingOverload() override { }
|
Chris@476
|
59
|
Chris@508
|
60 QString getRecordContainerFolder();
|
Chris@483
|
61 QString getRecordFolder();
|
Chris@483
|
62
|
Chris@574
|
63 virtual bool isRecording() const override { return m_recording; }
|
Chris@574
|
64 virtual sv_frame_t getRecordDuration() const override { return m_frameCount; }
|
Chris@574
|
65
|
Chris@580
|
66 /**
|
Chris@580
|
67 * Return the current input levels in the range 0.0 -> 1.0, for
|
Chris@580
|
68 * metering purposes. The values returned are the peak values
|
Chris@580
|
69 * since the last time this function was called (after which they
|
Chris@580
|
70 * are reset to zero until setInputLevels is called again by the
|
Chris@580
|
71 * driver).
|
Chris@580
|
72 *
|
Chris@580
|
73 * Return true if the values have been set since this function was
|
Chris@580
|
74 * last called (i.e. if they are meaningful). Return false if they
|
Chris@580
|
75 * have not been set (in which case both will be zero).
|
Chris@580
|
76 */
|
Chris@580
|
77 virtual bool getInputLevels(float &left, float &right) override;
|
Chris@574
|
78
|
Chris@574
|
79 WritableWaveFileModel *startRecording(); // caller takes ownership of model
|
Chris@476
|
80 void stopRecording();
|
Chris@477
|
81
|
Chris@477
|
82 signals:
|
Chris@477
|
83 void recordStatusChanged(bool recording);
|
Chris@485
|
84 void recordDurationChanged(sv_frame_t, sv_samplerate_t); // emitted occasionally
|
Chris@497
|
85 void recordCompleted();
|
Chris@477
|
86
|
Chris@477
|
87 protected slots:
|
Chris@477
|
88 void modelAboutToBeDeleted();
|
Chris@575
|
89 void updateModel();
|
Chris@476
|
90
|
Chris@476
|
91 private:
|
Chris@476
|
92 ViewManagerBase *m_viewManager;
|
Chris@476
|
93 std::string m_clientName;
|
Chris@575
|
94 std::atomic_bool m_recording;
|
Chris@476
|
95 sv_samplerate_t m_recordSampleRate;
|
Chris@546
|
96 int m_recordChannelCount;
|
Chris@485
|
97 sv_frame_t m_frameCount;
|
Chris@476
|
98 QString m_audioFileName;
|
Chris@477
|
99 WritableWaveFileModel *m_model;
|
Chris@575
|
100 RingBuffer<float> **m_buffers;
|
Chris@575
|
101 QMutex m_bufPtrMutex;
|
Chris@575
|
102 int m_bufferCount;
|
Chris@574
|
103 float m_inputLeft;
|
Chris@574
|
104 float m_inputRight;
|
Chris@580
|
105 bool m_levelsSet;
|
Chris@575
|
106
|
Chris@575
|
107 void recreateBuffers();
|
Chris@476
|
108 };
|
Chris@476
|
109
|
Chris@476
|
110 #endif
|