/[svn]/linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 411 - (hide annotations) (download)
Sat Feb 26 02:01:14 2005 UTC (19 years, 2 months ago) by schoenebeck
File size: 9964 byte(s)
* design change: using now one sampler engine instance and one disk thread
  instance for all sampler channels that are connected to the same audio
  output device (and are using the same engine type of course)
* added EngineFactory / EngineChannelFactory to remove the annoying build
  dependencies e.g. of the lscpserver to the actual sampler engine
  implementations
* bumped version to 0.3.0 (current CVS state is still quite broken,
  previous, stable CVS version was tagged as "v0_2_0" and is also available
  as source tarball)

1 schoenebeck 200 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 411 * Copyright (C) 2005 Christian Schoenebeck *
7 schoenebeck 200 * *
8     * This program 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 2 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, write to the Free Software *
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21     * MA 02111-1307 USA *
22     ***************************************************************************/
23    
24     #include "AudioOutputDeviceFactory.h"
25     #include "AudioOutputDevice.h"
26    
27     namespace LinuxSampler {
28    
29 schoenebeck 226 // *************** ParameterActive ***************
30     // *
31    
32     AudioOutputDevice::ParameterActive::ParameterActive() : DeviceCreationParameterBool() {
33     InitWithDefault();
34     }
35    
36     AudioOutputDevice::ParameterActive::ParameterActive(String s) : DeviceCreationParameterBool(s) {
37     }
38    
39     String AudioOutputDevice::ParameterActive::Description() {
40     return "Enable / disable device";
41     }
42    
43     bool AudioOutputDevice::ParameterActive::Fix() {
44     return false;
45     }
46    
47     bool AudioOutputDevice::ParameterActive::Mandatory() {
48     return false;
49     }
50    
51     std::map<String,DeviceCreationParameter*> AudioOutputDevice::ParameterActive::DependsAsParameters() {
52     return std::map<String,DeviceCreationParameter*>();
53     }
54    
55     optional<bool> AudioOutputDevice::ParameterActive::DefaultAsBool(std::map<String,String> Parameters) {
56     return true;
57     }
58    
59     void AudioOutputDevice::ParameterActive::OnSetValue(bool b) throw (LinuxSamplerException) {
60     if (b) ((AudioOutputDevice*)pDevice)->Play();
61     else ((AudioOutputDevice*)pDevice)->Stop();
62     }
63    
64     String AudioOutputDevice::ParameterActive::Name() {
65     return "ACTIVE";
66     }
67    
68    
69    
70     // *************** ParameterSampleRate ***************
71     // *
72    
73     AudioOutputDevice::ParameterSampleRate::ParameterSampleRate() : DeviceCreationParameterInt() {
74     InitWithDefault();
75     }
76    
77     AudioOutputDevice::ParameterSampleRate::ParameterSampleRate(String s) : DeviceCreationParameterInt(s) {
78     }
79    
80     String AudioOutputDevice::ParameterSampleRate::Description() {
81     return "Output sample rate";
82     }
83    
84     bool AudioOutputDevice::ParameterSampleRate::Fix() {
85     return true;
86     }
87    
88     bool AudioOutputDevice::ParameterSampleRate::Mandatory() {
89     return false;
90     }
91    
92     std::map<String,DeviceCreationParameter*> AudioOutputDevice::ParameterSampleRate::DependsAsParameters() {
93     return std::map<String,DeviceCreationParameter*>();
94     }
95    
96     optional<int> AudioOutputDevice::ParameterSampleRate::DefaultAsInt(std::map<String,String> Parameters) {
97     return 44100;
98     }
99    
100     optional<int> AudioOutputDevice::ParameterSampleRate::RangeMinAsInt(std::map<String,String> Parameters) {
101     return optional<int>::nothing;
102     }
103    
104     optional<int> AudioOutputDevice::ParameterSampleRate::RangeMaxAsInt(std::map<String,String> Parameters) {
105     return optional<int>::nothing;
106     }
107    
108     std::vector<int> AudioOutputDevice::ParameterSampleRate::PossibilitiesAsInt(std::map<String,String> Parameters) {
109     return std::vector<int>();
110     }
111    
112     void AudioOutputDevice::ParameterSampleRate::OnSetValue(int i) throw (LinuxSamplerException) {
113     /* cannot happen, as parameter is fix */
114     }
115    
116     String AudioOutputDevice::ParameterSampleRate::Name() {
117     return "SAMPLERATE";
118     }
119    
120    
121    
122     // *************** ParameterChannels ***************
123     // *
124    
125     AudioOutputDevice::ParameterChannels::ParameterChannels() : DeviceCreationParameterInt() {
126     InitWithDefault();
127     }
128    
129     AudioOutputDevice::ParameterChannels::ParameterChannels(String s) : DeviceCreationParameterInt(s) {
130     }
131    
132     String AudioOutputDevice::ParameterChannels::Description() {
133     return "Number of output channels";
134     }
135    
136     bool AudioOutputDevice::ParameterChannels::Fix() {
137     return false;
138     }
139    
140     bool AudioOutputDevice::ParameterChannels::Mandatory() {
141     return false;
142     }
143    
144     std::map<String,DeviceCreationParameter*> AudioOutputDevice::ParameterChannels::DependsAsParameters() {
145     return std::map<String,DeviceCreationParameter*>();
146     }
147    
148     optional<int> AudioOutputDevice::ParameterChannels::DefaultAsInt(std::map<String,String> Parameters) {
149     return 2;
150     }
151    
152     optional<int> AudioOutputDevice::ParameterChannels::RangeMinAsInt(std::map<String,String> Parameters) {
153     return optional<int>::nothing;
154     }
155    
156     optional<int> AudioOutputDevice::ParameterChannels::RangeMaxAsInt(std::map<String,String> Parameters) {
157     return optional<int>::nothing;
158     }
159    
160     std::vector<int> AudioOutputDevice::ParameterChannels::PossibilitiesAsInt(std::map<String,String> Parameters) {
161     return std::vector<int>();
162     }
163    
164     void AudioOutputDevice::ParameterChannels::OnSetValue(int i) throw (LinuxSamplerException) {
165     ((AudioOutputDevice*)pDevice)->AcquireChannels(i);
166     }
167    
168     String AudioOutputDevice::ParameterChannels::Name() {
169     return "CHANNELS";
170     }
171    
172    
173    
174     // *************** AudioOutputDevice ***************
175     // *
176    
177 schoenebeck 200 AudioOutputDevice::AudioOutputDevice(std::map<String,DeviceCreationParameter*> DriverParameters) {
178     this->Parameters = DriverParameters;
179     }
180    
181     AudioOutputDevice::~AudioOutputDevice() {
182 schoenebeck 226 // delete all audio channels
183     {
184     std::vector<AudioChannel*>::iterator iter = Channels.begin();
185     while (iter != Channels.end()) {
186     Channels.erase(iter);
187     delete *iter;
188     iter++;
189     }
190    
191 schoenebeck 200 }
192 schoenebeck 226
193     // delete all device parameters
194     {
195     std::map<String,DeviceCreationParameter*>::iterator iter = Parameters.begin();
196     while (iter != Parameters.end()) {
197     Parameters.erase(iter);
198     delete iter->second;
199     iter++;
200     }
201     }
202 schoenebeck 200 }
203    
204 schoenebeck 411 void AudioOutputDevice::Connect(EngineChannel* pEngineChannel) {
205     if (EngineChannels.find(pEngineChannel) == EngineChannels.end()) {
206     pEngineChannel->Connect(this);
207     EngineChannels.insert(pEngineChannel);
208 schoenebeck 200 }
209     }
210    
211 schoenebeck 411 void AudioOutputDevice::Disconnect(EngineChannel* pEngineChannel) {
212     if (EngineChannels.find(pEngineChannel) != EngineChannels.end()) { // if clause to prevent disconnect loop
213     EngineChannels.erase(pEngineChannel);
214     pEngineChannel->DisconnectAudioOutputDevice();
215 schoenebeck 200 }
216     }
217    
218     AudioChannel* AudioOutputDevice::Channel(uint ChannelIndex) {
219     return (ChannelIndex < Channels.size()) ? Channels[ChannelIndex] : NULL;
220     }
221    
222 schoenebeck 226 void AudioOutputDevice::AcquireChannels(uint Channels) {
223     if (Channels > this->Channels.size()) {
224     for (int c = this->Channels.size(); c < Channels; c++) {
225     this->Channels.push_back(CreateChannel(c));
226     }
227     }
228     }
229    
230 schoenebeck 200 std::map<String,DeviceCreationParameter*> AudioOutputDevice::DeviceParameters() {
231     return Parameters;
232     }
233    
234     int AudioOutputDevice::RenderAudio(uint Samples) {
235     if (Channels.empty()) return 0;
236    
237     // reset all channels with silence
238     {
239     std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();
240     std::vector<AudioChannel*>::iterator end = Channels.end();
241     for (; iterChannels != end; iterChannels++)
242     (*iterChannels)->Clear(); // zero out audio buffer
243     }
244    
245     int result = 0;
246    
247     // let all connected engines render audio for the current audio fragment cycle
248 schoenebeck 272 #if USE_EXCEPTIONS
249     try
250     #endif // USE_EXCEPTIONS
251 schoenebeck 200 {
252 schoenebeck 411 std::set<EngineChannel*>::iterator iterEngineCh = EngineChannels.begin();
253     std::set<EngineChannel*>::iterator end = EngineChannels.end();
254     for (; iterEngineCh != end; iterEngineCh++) {
255     int res = (*iterEngineCh)->RenderAudio(Samples);
256 schoenebeck 200 if (res != 0) result = res;
257     }
258     }
259 schoenebeck 272 #if USE_EXCEPTIONS
260     catch (std::runtime_error se) {
261     std::cerr << "std::runtime_error: " << se.what() << std::endl << std::flush;
262     exit(EXIT_FAILURE);
263     }
264     #endif // USE_EXCEPTIONS
265 schoenebeck 200
266     return result;
267     }
268    
269     int AudioOutputDevice::RenderSilence(uint Samples) {
270     if (Channels.empty()) return 0;
271    
272     // reset all channels with silence
273     {
274     std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();
275     std::vector<AudioChannel*>::iterator end = Channels.end();
276     for (; iterChannels != end; iterChannels++)
277     (*iterChannels)->Clear(); // zero out audio buffer
278     }
279    
280     return 0;
281     }
282    
283     } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC