annotate audio/AudioCallbackRecordTarget.h @ 626:51ecc3e2d71c

Don't resample an incoming audio file to match the main model's rate, if the aim of importing is to replace the main model anyway
author Chris Cannam
date Tue, 09 Oct 2018 15:55:16 +0100
parents bfa9604714c9
children 56a81812c131
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@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@483 59
Chris@574 60 virtual bool isRecording() const override { return m_recording; }
Chris@574 61 virtual sv_frame_t getRecordDuration() const override { return m_frameCount; }
Chris@574 62
Chris@580 63 /**
Chris@580 64 * Return the current input levels in the range 0.0 -> 1.0, for
Chris@580 65 * metering purposes. The values returned are the peak values
Chris@580 66 * since the last time this function was called (after which they
Chris@580 67 * are reset to zero until setInputLevels is called again by the
Chris@580 68 * driver).
Chris@580 69 *
Chris@580 70 * Return true if the values have been set since this function was
Chris@580 71 * last called (i.e. if they are meaningful). Return false if they
Chris@580 72 * have not been set (in which case both will be zero).
Chris@580 73 */
Chris@580 74 virtual bool getInputLevels(float &left, float &right) override;
Chris@574 75
Chris@574 76 WritableWaveFileModel *startRecording(); // caller takes ownership of model
Chris@476 77 void stopRecording();
Chris@477 78
Chris@477 79 signals:
Chris@477 80 void recordStatusChanged(bool recording);
Chris@485 81 void recordDurationChanged(sv_frame_t, sv_samplerate_t); // emitted occasionally
Chris@497 82 void recordCompleted();
Chris@477 83
Chris@477 84 protected slots:
Chris@477 85 void modelAboutToBeDeleted();
Chris@575 86 void updateModel();
Chris@476 87
Chris@476 88 private:
Chris@476 89 ViewManagerBase *m_viewManager;
Chris@476 90 std::string m_clientName;
Chris@575 91 std::atomic_bool m_recording;
Chris@476 92 sv_samplerate_t m_recordSampleRate;
Chris@546 93 int m_recordChannelCount;
Chris@485 94 sv_frame_t m_frameCount;
Chris@476 95 QString m_audioFileName;
Chris@477 96 WritableWaveFileModel *m_model;
Chris@575 97 RingBuffer<float> **m_buffers;
Chris@575 98 QMutex m_bufPtrMutex;
Chris@575 99 int m_bufferCount;
Chris@574 100 float m_inputLeft;
Chris@574 101 float m_inputRight;
Chris@580 102 bool m_levelsSet;
Chris@575 103
Chris@575 104 void recreateBuffers();
Chris@476 105 };
Chris@476 106
Chris@476 107 #endif