To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / CollidoscopeApp / include / AudioEngine.h @ 16:4dad0b810f18

History | View | Annotate | Download (3.9 KB)

1 5:75b744078d66 f
/*
2

3
 Copyright (C) 2016  Queen Mary University of London
4
 Author: Fiore Martin
5

6
 This file is part of Collidoscope.
7

8
 Collidoscope is free software: you can redistribute it and/or modify
9
 it under the terms of the GNU General Public License as published by
10
 the Free Software Foundation, either version 3 of the License, or
11
 (at your option) any later version.
12

13
 This program is distributed in the hope that it will be useful,
14
 but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
 GNU General Public License for more details.
17

18
 You should have received a copy of the GNU General Public License
19
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
*/
21
22 0:02467299402e f
#pragma once
23
24
#include <array>
25
26
#include "cinder/audio/Context.h"
27
#include "cinder/audio/ChannelRouterNode.h"
28
#include "cinder/audio/MonitorNode.h"
29
#include "cinder/audio/FilterNode.h"
30
#include "BufferToWaveRecorderNode.h"
31
#include "PGranularNode.h"
32
#include "RingBufferPack.h"
33
34
#include "Messages.h"
35
#include "Config.h"
36
37
38 2:dd889fff8423 f
/**
39
 * Audio engine of the application. It uses the Cinder library to process audio in input and output.
40
 * The audio engine manages both waves. All methods have a waveIndx parameter to address a specific wave.
41
 */
42 0:02467299402e f
class AudioEngine
43
{
44
public:
45
46
    AudioEngine();
47
48
    ~AudioEngine();
49
50
    // no copies
51
    AudioEngine( const AudioEngine &copy ) = delete;
52
    AudioEngine & operator=(const AudioEngine &copy) = delete;
53
54 2:dd889fff8423 f
    /**
55
    * Set up of the audio engine.
56
    */
57 0:02467299402e f
    void setup( const Config& Config );
58
59
    size_t getSampleRate();
60
61
    void record( size_t index );
62
63
    void loopOn( size_t waveIdx );
64
65
    void loopOff( size_t waveIdx );
66
67
    void noteOn( size_t waveIdx, int note );
68
69
    void noteOff( size_t waveIdx, int note );
70
71 2:dd889fff8423 f
    /**
72
    * Returns the number of elements available to read in the wave ring buffer.
73
    * The wave ring buffer is used to pass the size of the wave chunks from the audio thread to the graphic thread,
74
    * when a new wave is recorded.
75
    */
76 0:02467299402e f
    size_t getRecordWaveAvailable( size_t index );
77 2:dd889fff8423 f
    /**
78 16:4dad0b810f18 f
    * Called from the graphic thread. Reads \a count elements from the wave ring buffer into \a buffer.
79 2:dd889fff8423 f
    * The wave ring buffer is used to pass the size of the wave chunks from the audio thread to the graphic thread,
80
    * when a new wave is recorded.
81
    *
82
    */
83
    bool readRecordWave( size_t waveIdx, RecordWaveMsg* buffer, size_t count );
84 0:02467299402e f
85
    void setSelectionSize( size_t waveIdx, size_t size );
86
87
    void setSelectionStart( size_t waveIdx, size_t start );
88
89
    void setGrainDurationCoeff( size_t waveIdx, double coeff );
90
91
    void setFilterCutoff( size_t waveIdx, double cutoff );
92
93
    void checkCursorTriggers( size_t waveIdx, std::vector<CursorTriggerMsg>& cursorTriggers );
94
95 2:dd889fff8423 f
    /**
96
     * Returns a const reference to the audio output buffer. This is the buffer that is sent off to the audio interface at each audio cycle.
97
     * It is used in the graphic thread to draw the oscilloscope.
98
     */
99 0:02467299402e f
    const ci::audio::Buffer& getAudioOutputBuffer( size_t waveIdx ) const;
100
101
102
private:
103
104
    // nodes for mic input
105
    std::array< ci::audio::ChannelRouterNodeRef, NUM_WAVES > mInputRouterNodes;
106
    // nodes for recording audio input into buffer. Also sends chunks information through
107
    // non-blocking queue
108
    std::array< BufferToWaveRecorderNodeRef, NUM_WAVES > mBufferRecorderNodes;
109 16:4dad0b810f18 f
    // pgranulars wrapped in a Cinder::Node
110 0:02467299402e f
    std::array< PGranularNodeRef, NUM_WAVES > mPGranularNodes;
111
112
113
    std::array< ci::audio::ChannelRouterNodeRef, NUM_WAVES > mOutputRouterNodes;
114
    // nodes to get the audio buffer scoped in the oscilloscope
115
    std::array< ci::audio::MonitorNodeRef, NUM_WAVES > mOutputMonitorNodes;
116
    // nodes for lowpass filtering
117
    std::array< cinder::audio::FilterLowPassNodeRef, NUM_WAVES> mLowPassFilterNodes;
118
119
    std::array< std::unique_ptr< RingBufferPack<CursorTriggerMsg> >, NUM_WAVES > mCursorTriggerRingBufferPacks;
120
121 2:dd889fff8423 f
};