1 /**********************************************************************
2 
3 Audacity: A Digital Audio Editor
4 
5 ProjectAudioIO.h
6 
7 Paul Licameli split from AudacityProject.h
8 
9 **********************************************************************/
10 
11 #ifndef __PROJECT_AUDIO_IO__
12 #define __PROJECT_AUDIO_IO__
13 
14 #include "ClientData.h" // to inherit
15 #include <wx/weakref.h>
16 #include <wx/event.h> // to declare custom event type
17 
18 #include <atomic>
19 #include <memory>
20 class AudacityProject;
21 class Meter;
22 
23 // Sent to the project when the play speed changes
24 wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API,
25    EVT_PLAY_SPEED_CHANGE, wxCommandEvent);
26 
27 ///\ brief Holds per-project state needed for interaction with AudioIO,
28 /// including the audio stream token and pointers to meters
29 class AUDACITY_DLL_API ProjectAudioIO final
30    : public ClientData::Base
31 {
32 public:
33    static ProjectAudioIO &Get( AudacityProject &project );
34    static const ProjectAudioIO &Get( const AudacityProject &project );
35 
36    explicit ProjectAudioIO( AudacityProject &project );
37    ProjectAudioIO( const ProjectAudioIO & ) PROHIBITED;
38    ProjectAudioIO &operator=( const ProjectAudioIO & ) PROHIBITED;
39    ~ProjectAudioIO();
40 
41    int GetAudioIOToken() const;
42    bool IsAudioActive() const;
43    void SetAudioIOToken(int token);
44 
45    const std::shared_ptr<Meter> &GetPlaybackMeter() const;
46    void SetPlaybackMeter(
47       const std::shared_ptr<Meter> &playback);
48    const std::shared_ptr<Meter> &GetCaptureMeter() const;
49    void SetCaptureMeter(
50       const std::shared_ptr<Meter> &capture);
51 
52    // Speed play
GetPlaySpeed()53    double GetPlaySpeed() const {
54       return mPlaySpeed.load( std::memory_order_relaxed ); }
55    void SetPlaySpeed( double value );
56 
57 private:
58    AudacityProject &mProject;
59 
60    // Project owned meters
61    std::shared_ptr<Meter> mPlaybackMeter;
62    std::shared_ptr<Meter> mCaptureMeter;
63 
64    // This is atomic because scrubber may read it in a separate thread from
65    // the main
66    std::atomic<double> mPlaySpeed{};
67 
68    int  mAudioIOToken{ -1 };
69 };
70 
71 #endif
72