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

Diff of /linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceAlsa.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 221 by schoenebeck, Fri Aug 20 17:25:19 2004 UTC revision 226 by schoenebeck, Wed Aug 25 22:00:33 2004 UTC
# Line 144  namespace LinuxSampler { Line 144  namespace LinuxSampler {
144      }      }
145    
146      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMinAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMinAsInt(std::map<String,String> Parameters) {
147          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
148    
149            // obtain information from given sound card
150            String pcm_name       = "hw:" + Parameters["CARD"];
151            snd_pcm_t* pcm_handle = NULL;
152            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
153            snd_pcm_hw_params_t* hwparams;
154            snd_pcm_hw_params_alloca(&hwparams);
155            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
156                snd_pcm_close(pcm_handle);
157                return optional<int>::nothing;
158            }
159            int dir = 0;
160            uint periods_min;
161            if (snd_pcm_hw_params_get_periods_min(hwparams, &periods_min, &dir) < 0) {
162                snd_pcm_close(pcm_handle);
163                return optional<int>::nothing;
164            }
165            snd_pcm_close(pcm_handle);
166            return (int) periods_min;
167      }      }
168    
169      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMaxAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMaxAsInt(std::map<String,String> Parameters) {
170          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
171    
172            // obtain information from given sound card
173            String pcm_name       = "hw:" + Parameters["CARD"];
174            snd_pcm_t* pcm_handle = NULL;
175            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
176            snd_pcm_hw_params_t* hwparams;
177            snd_pcm_hw_params_alloca(&hwparams);
178            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
179                snd_pcm_close(pcm_handle);
180                return optional<int>::nothing;
181            }
182            int dir = 0;
183            uint periods_max;
184            if (snd_pcm_hw_params_get_periods_max(hwparams, &periods_max, &dir) < 0) {
185                snd_pcm_close(pcm_handle);
186                return optional<int>::nothing;
187            }
188            snd_pcm_close(pcm_handle);
189            return (int) periods_max;
190      }      }
191    
192      std::vector<int> AudioOutputDeviceAlsa::ParameterFragments::PossibilitiesAsInt(std::map<String,String> Parameters) {      std::vector<int> AudioOutputDeviceAlsa::ParameterFragments::PossibilitiesAsInt(std::map<String,String> Parameters) {
# Line 199  namespace LinuxSampler { Line 237  namespace LinuxSampler {
237      }      }
238    
239      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMinAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMinAsInt(std::map<String,String> Parameters) {
240          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
241    
242            // obtain information from given sound card
243            String pcm_name       = "hw:" + Parameters["CARD"];
244            snd_pcm_t* pcm_handle = NULL;
245            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
246            snd_pcm_hw_params_t* hwparams;
247            snd_pcm_hw_params_alloca(&hwparams);
248            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
249                snd_pcm_close(pcm_handle);
250                return optional<int>::nothing;
251            }
252            int dir = 0;
253            unsigned long period_size_min;
254            if (snd_pcm_hw_params_get_period_size_min(hwparams, &period_size_min, &dir) < 0) {
255                snd_pcm_close(pcm_handle);
256                return optional<int>::nothing;
257            }
258            snd_pcm_close(pcm_handle);
259            return (int) period_size_min;
260      }      }
261    
262      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMaxAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMaxAsInt(std::map<String,String> Parameters) {
263          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
264    
265            // obtain information from given sound card
266            String pcm_name       = "hw:" + Parameters["CARD"];
267            snd_pcm_t* pcm_handle = NULL;
268            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
269            snd_pcm_hw_params_t* hwparams;
270            snd_pcm_hw_params_alloca(&hwparams);
271            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
272                snd_pcm_close(pcm_handle);
273                return optional<int>::nothing;
274            }
275            int dir = 0;
276            unsigned long period_size_max;
277            if (snd_pcm_hw_params_get_period_size_max(hwparams, &period_size_max, &dir) < 0) {
278                snd_pcm_close(pcm_handle);
279                return optional<int>::nothing;
280            }
281            snd_pcm_close(pcm_handle);
282            return (int) period_size_max; //FIXME: might overflow int limit
283      }      }
284    
285      std::vector<int> AudioOutputDeviceAlsa::ParameterFragmentSize::PossibilitiesAsInt(std::map<String,String> Parameters) {      std::vector<int> AudioOutputDeviceAlsa::ParameterFragmentSize::PossibilitiesAsInt(std::map<String,String> Parameters) {
# Line 344  namespace LinuxSampler { Line 420  namespace LinuxSampler {
420          pAlsaOutputBuffer = new int16_t[uiAlsaChannels * FragmentSize];          pAlsaOutputBuffer = new int16_t[uiAlsaChannels * FragmentSize];
421    
422          // create audio channels for this audio device to which the sampler engines can write to          // create audio channels for this audio device to which the sampler engines can write to
423          for (int i = 0; i < uiAlsaChannels; i++) this->Channels.push_back(new AudioChannel(FragmentSize));          for (int i = 0; i < uiAlsaChannels; i++) this->Channels.push_back(new AudioChannel(i, FragmentSize));
424    
425          if (((DeviceCreationParameterBool*)Parameters["ACTIVE"])->ValueAsBool()) {          if (((DeviceCreationParameterBool*)Parameters["ACTIVE"])->ValueAsBool()) {
426                  Play();                  Play();
# Line 359  namespace LinuxSampler { Line 435  namespace LinuxSampler {
435          //FIXME: currently commented out due to segfault          //FIXME: currently commented out due to segfault
436          //snd_pcm_close(pcm_handle);          //snd_pcm_close(pcm_handle);
437    
         // destroy all audio channels  
         for (int c = 0; c < Channels.size(); c++) delete Channels[c];  
   
438          if (pAlsaOutputBuffer) {          if (pAlsaOutputBuffer) {
439              //FIXME: currently commented out due to segfault              //FIXME: currently commented out due to segfault
440              //delete[] pOutputBuffer;              //delete[] pOutputBuffer;
# Line 428  namespace LinuxSampler { Line 501  namespace LinuxSampler {
501          StopThread();          StopThread();
502      }      }
503    
504      void AudioOutputDeviceAlsa::AcquireChannels(uint Channels) {      AudioChannel* AudioOutputDeviceAlsa::CreateChannel(uint ChannelNr) {
505          if (Channels > uiAlsaChannels) {          // just create a mix channel
506              // just create mix channel(s)          return new AudioChannel(ChannelNr, Channel(ChannelNr % uiAlsaChannels));
             for (int i = uiAlsaChannels; i < Channels; i++) {  
                 AudioChannel* pNewChannel = new AudioChannel(this->Channels[i % uiAlsaChannels]);  
                 this->Channels.push_back(pNewChannel);  
             }  
         }  
507      }      }
508    
509      uint AudioOutputDeviceAlsa::MaxSamplesPerCycle() {      uint AudioOutputDeviceAlsa::MaxSamplesPerCycle() {
# Line 459  namespace LinuxSampler { Line 527  namespace LinuxSampler {
527      }      }
528    
529      String AudioOutputDeviceAlsa::Version() {      String AudioOutputDeviceAlsa::Version() {
530         String s = "$Revision: 1.13 $";         String s = "$Revision: 1.14 $";
531         return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword         return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword
532      }      }
533    

Legend:
Removed from v.221  
changed lines
  Added in v.226

  ViewVC Help
Powered by ViewVC