-rw-r--r-- | libopie2/examples/opiemm/osoundsystemdemo/osoundsystemdemo.cpp | 3 | ||||
-rw-r--r-- | libopie2/opiemm/osoundsystem.cpp | 25 | ||||
-rw-r--r-- | libopie2/opiemm/osoundsystem.h | 6 |
3 files changed, 30 insertions, 4 deletions
diff --git a/libopie2/examples/opiemm/osoundsystemdemo/osoundsystemdemo.cpp b/libopie2/examples/opiemm/osoundsystemdemo/osoundsystemdemo.cpp index b522441..f74a1b9 100644 --- a/libopie2/examples/opiemm/osoundsystemdemo/osoundsystemdemo.cpp +++ b/libopie2/examples/opiemm/osoundsystemdemo/osoundsystemdemo.cpp | |||
@@ -42,24 +42,25 @@ int main( int argc, char** argv ) | |||
42 | /* | 42 | /* |
43 | while ( it.current() ) | 43 | while ( it.current() ) |
44 | { | 44 | { |
45 | odebug << "DEMO: OSoundSystem contains Interface '" << it.current()->name() << "'" << oendl; | 45 | odebug << "DEMO: OSoundSystem contains Interface '" << it.current()->name() << "'" << oendl; |
46 | ++it; | 46 | ++it; |
47 | } | 47 | } |
48 | 48 | ||
49 | */ | 49 | */ |
50 | OSoundCard* card = it.current(); | 50 | OSoundCard* card = it.current(); |
51 | 51 | ||
52 | OMixerInterface* mixer = card->mixer(); | 52 | OMixerInterface* mixer = card->mixer(); |
53 | 53 | ||
54 | QStringList channels = mixer->allChannels(); | 54 | QStringList channels = mixer->allChannels(); |
55 | 55 | ||
56 | for ( QStringList::Iterator it = channels.begin(); it != channels.end(); ++it ) | 56 | for ( QStringList::Iterator it = channels.begin(); it != channels.end(); ++it ) |
57 | { | 57 | { |
58 | odebug << "OSSDEMO: Mixer has channel " << *it << "" << oendl; | 58 | bool stereo = mixer->isStereo( *it ); |
59 | odebug << "OSSDEMO: Mixer has channel " << *it << ( stereo ? "[stereo]" : "[mono]" ) << oendl; | ||
59 | odebug << "OSSDEMO: +--- volume " << ( mixer->volume( *it ) & 0xff ) | 60 | odebug << "OSSDEMO: +--- volume " << ( mixer->volume( *it ) & 0xff ) |
60 | << " (left) | " << ( mixer->volume( *it ) >> 8 ) << " (right)" << oendl; | 61 | << " (left) | " << ( mixer->volume( *it ) >> 8 ) << " (right)" << oendl; |
61 | } | 62 | } |
62 | 63 | ||
63 | return 0; | 64 | return 0; |
64 | 65 | ||
65 | } | 66 | } |
diff --git a/libopie2/opiemm/osoundsystem.cpp b/libopie2/opiemm/osoundsystem.cpp index 13b26e6..09fd28f 100644 --- a/libopie2/opiemm/osoundsystem.cpp +++ b/libopie2/opiemm/osoundsystem.cpp | |||
@@ -181,33 +181,33 @@ OMixerInterface::OMixerInterface( QObject* parent, const char* name ) | |||
181 | odebug << "OMixerInterface::OMixerInterface()" << oendl; | 181 | odebug << "OMixerInterface::OMixerInterface()" << oendl; |
182 | init(); | 182 | init(); |
183 | } | 183 | } |
184 | 184 | ||
185 | 185 | ||
186 | OMixerInterface::~OMixerInterface() | 186 | OMixerInterface::~OMixerInterface() |
187 | { | 187 | { |
188 | } | 188 | } |
189 | 189 | ||
190 | 190 | ||
191 | void OMixerInterface::init() | 191 | void OMixerInterface::init() |
192 | { | 192 | { |
193 | // open the device | 193 | // open the device |
194 | _fd = ::open( name(), O_RDWR ); | 194 | _fd = ::open( name(), O_RDWR ); |
195 | if ( _fd == -1 ) | 195 | if ( _fd == -1 ) |
196 | { | 196 | { |
197 | owarn << "OMixerInterface::init(): Can't open mixer." << oendl; | 197 | owarn << "OMixerInterface::init(): Can't open mixer " << name() << oendl; |
198 | return; | 198 | return; |
199 | } | 199 | } |
200 | 200 | ||
201 | // construct the device capabilities | 201 | // construct the device capabilities |
202 | int devmask = 0; | 202 | int devmask = 0; |
203 | if ( ioctl( _fd, SOUND_MIXER_READ_DEVMASK, &devmask ) != -1 ) | 203 | if ( ioctl( _fd, SOUND_MIXER_READ_DEVMASK, &devmask ) != -1 ) |
204 | { | 204 | { |
205 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "PlayVolume", SOUND_MIXER_VOLUME ); | 205 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "PlayVolume", SOUND_MIXER_VOLUME ); |
206 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "PlayBass", SOUND_MIXER_BASS ); | 206 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "PlayBass", SOUND_MIXER_BASS ); |
207 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "PlayTreble", SOUND_MIXER_TREBLE ); | 207 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "PlayTreble", SOUND_MIXER_TREBLE ); |
208 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "PlaySynth", SOUND_MIXER_SYNTH ); | 208 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "PlaySynth", SOUND_MIXER_SYNTH ); |
209 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "PlayPCM", SOUND_MIXER_PCM ); | 209 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "PlayPCM", SOUND_MIXER_PCM ); |
210 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "PlaySpeaker", SOUND_MIXER_SPEAKER ); | 210 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "PlaySpeaker", SOUND_MIXER_SPEAKER ); |
211 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "PlayLine", SOUND_MIXER_LINE ); | 211 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "PlayLine", SOUND_MIXER_LINE ); |
212 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "PlayMic", SOUND_MIXER_MIC ); | 212 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "PlayMic", SOUND_MIXER_MIC ); |
213 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "PlayCD", SOUND_MIXER_CD ); | 213 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "PlayCD", SOUND_MIXER_CD ); |
@@ -226,32 +226,38 @@ void OMixerInterface::init() | |||
226 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "RecBass", SOUND_MIXER_BASS ); | 226 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "RecBass", SOUND_MIXER_BASS ); |
227 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "RecTreble", SOUND_MIXER_TREBLE ); | 227 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "RecTreble", SOUND_MIXER_TREBLE ); |
228 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "RecSynth", SOUND_MIXER_SYNTH ); | 228 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "RecSynth", SOUND_MIXER_SYNTH ); |
229 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "RecPCM", SOUND_MIXER_PCM ); | 229 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "RecPCM", SOUND_MIXER_PCM ); |
230 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "RecSpeaker", SOUND_MIXER_SPEAKER ); | 230 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "RecSpeaker", SOUND_MIXER_SPEAKER ); |
231 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "RecLine", SOUND_MIXER_LINE ); | 231 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "RecLine", SOUND_MIXER_LINE ); |
232 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "RecMic", SOUND_MIXER_MIC ); | 232 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "RecMic", SOUND_MIXER_MIC ); |
233 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "RecCD", SOUND_MIXER_CD ); | 233 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "RecCD", SOUND_MIXER_CD ); |
234 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "RecInputMix", SOUND_MIXER_IMIX ); | 234 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "RecInputMix", SOUND_MIXER_IMIX ); |
235 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "RecAltPCM", SOUND_MIXER_ALTPCM ); | 235 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "RecAltPCM", SOUND_MIXER_ALTPCM ); |
236 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "RecRecord", SOUND_MIXER_RECLEV ); | 236 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "RecRecord", SOUND_MIXER_RECLEV ); |
237 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "RecInputGain", SOUND_MIXER_IGAIN ); | 237 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "RecInputGain", SOUND_MIXER_IGAIN ); |
238 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "RecOutputGain", SOUND_MIXER_OGAIN ); | 238 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "RecOutputGain", SOUND_MIXER_OGAIN ); |
239 | //odebug << "recmask available and constructed." << oendl; | 239 | //odebug << "recmask available and constructed." << oendl; |
240 | } | 240 | } |
241 | 241 | ||
242 | devmask = 0; | ||
243 | if ( ioctl( _fd, SOUND_MIXER_READ_STEREODEVS, &devmask ) != -1 ) | ||
244 | { | ||
245 | odebug << "stereomask = " << devmask << oendl; | ||
246 | } | ||
247 | |||
242 | /* ChannelIterator it; | 248 | /* ChannelIterator it; |
243 | for ( it = _channels.begin(); it != _channels.end(); ++it ) | 249 | for ( it = _channels.begin(); it != _channels.end(); ++it ) |
244 | { | 250 | { |
245 | odebug << "Channel " << it.key() << " available (bit " << it.data() << ")" << oendl; | 251 | odebug << "Channel " << it.key() << " available (bit " << it.data() << ")" << oendl; |
246 | odebug << " +--- Volume: " << volume( it.key() ) & 0xff << " | " << volume( it.key() ) >> 8 << "" << oendl; | 252 | odebug << " +--- Volume: " << volume( it.key() ) & 0xff << " | " << volume( it.key() ) >> 8 << "" << oendl; |
247 | } | 253 | } |
248 | */ | 254 | */ |
249 | } | 255 | } |
250 | 256 | ||
251 | QStringList OMixerInterface::allChannels() const | 257 | QStringList OMixerInterface::allChannels() const |
252 | { | 258 | { |
253 | ChannelIterator it = _channels.begin(); | 259 | ChannelIterator it = _channels.begin(); |
254 | QStringList channels; | 260 | QStringList channels; |
255 | while ( it != _channels.end() ) | 261 | while ( it != _channels.end() ) |
256 | { | 262 | { |
257 | channels += it.key(); | 263 | channels += it.key(); |
@@ -262,38 +268,53 @@ QStringList OMixerInterface::allChannels() const | |||
262 | 268 | ||
263 | 269 | ||
264 | QStringList OMixerInterface::recChannels() const | 270 | QStringList OMixerInterface::recChannels() const |
265 | { | 271 | { |
266 | owarn << "NYI" << oendl; | 272 | owarn << "NYI" << oendl; |
267 | return QStringList(); | 273 | return QStringList(); |
268 | } | 274 | } |
269 | 275 | ||
270 | 276 | ||
271 | QStringList OMixerInterface::playChannels() const | 277 | QStringList OMixerInterface::playChannels() const |
272 | { | 278 | { |
273 | owarn << "NYI" << oendl; | 279 | owarn << "NYI" << oendl; |
274 | return QStringList(); | 280 | return QStringList(); |
275 | } | 281 | } |
276 | 282 | ||
277 | 283 | ||
278 | bool OMixerInterface::hasChannel( const QString& channel ) | 284 | bool OMixerInterface::hasChannel( const QString& channel ) const |
279 | { | 285 | { |
280 | return _channels.contains( channel ); | 286 | return _channels.contains( channel ); |
281 | } | 287 | } |
282 | 288 | ||
283 | 289 | ||
290 | bool OMixerInterface::isStereo( const QString& channel ) const | ||
291 | { | ||
292 | bool result = false; | ||
293 | if ( _channels.contains( channel ) ) | ||
294 | { | ||
295 | int devmask = 0; | ||
296 | if ( ioctl( _fd, SOUND_MIXER_READ_STEREODEVS, &devmask ) != -1 ) | ||
297 | { | ||
298 | result = devmask & ( 1 << _channels[channel] ); | ||
299 | } | ||
300 | } | ||
301 | return result; | ||
302 | } | ||
303 | |||
304 | |||
284 | void OMixerInterface::setVolume( const QString& channel, int left, int right ) | 305 | void OMixerInterface::setVolume( const QString& channel, int left, int right ) |
285 | { | 306 | { |
286 | int volume = left; | 307 | int volume = left; |
287 | volume |= ( right == -1 ) ? left << 8 : right << 8; | 308 | volume |= ( right == -1 ) ? left << 8 : right << 8; |
288 | 309 | ||
289 | if ( _channels.contains( channel ) ) | 310 | if ( _channels.contains( channel ) ) |
290 | { | 311 | { |
291 | int result = ioctl( _fd, MIXER_WRITE( _channels[channel] ), &volume ); | 312 | int result = ioctl( _fd, MIXER_WRITE( _channels[channel] ), &volume ); |
292 | if ( result == -1 ) | 313 | if ( result == -1 ) |
293 | { | 314 | { |
294 | owarn << "Can't set volume: " << strerror( errno ) << oendl; | 315 | owarn << "Can't set volume: " << strerror( errno ) << oendl; |
295 | } | 316 | } |
296 | else | 317 | else |
297 | { | 318 | { |
298 | if ( result & 0xff != left ) | 319 | if ( result & 0xff != left ) |
299 | { | 320 | { |
diff --git a/libopie2/opiemm/osoundsystem.h b/libopie2/opiemm/osoundsystem.h index bd69114..ac7a5a7 100644 --- a/libopie2/opiemm/osoundsystem.h +++ b/libopie2/opiemm/osoundsystem.h | |||
@@ -189,33 +189,37 @@ class OMixerInterface : public QObject | |||
189 | /** | 189 | /** |
190 | * @returns all available channels. | 190 | * @returns all available channels. |
191 | */ | 191 | */ |
192 | QStringList allChannels() const; | 192 | QStringList allChannels() const; |
193 | /** | 193 | /** |
194 | * @returns recordable channels. | 194 | * @returns recordable channels. |
195 | */ | 195 | */ |
196 | QStringList recChannels() const; | 196 | QStringList recChannels() const; |
197 | /** | 197 | /** |
198 | * @returns playable channels. | 198 | * @returns playable channels. |
199 | */ | 199 | */ |
200 | QStringList playChannels() const; | 200 | QStringList playChannels() const; |
201 | 201 | ||
202 | /** | 202 | /** |
203 | * @returns true, if @a channel exists. | 203 | * @returns true, if @a channel exists. |
204 | */ | 204 | */ |
205 | bool hasChannel( const QString& channel ); | 205 | bool hasChannel( const QString& channel ) const; |
206 | /** | ||
207 | * @returns true, if @a channel is stereo. | ||
208 | */ | ||
209 | bool isStereo( const QString& channel ) const; | ||
206 | 210 | ||
207 | /** | 211 | /** |
208 | * Set the @a left and @a right volumes for @a channel. | 212 | * Set the @a left and @a right volumes for @a channel. |
209 | * If no value for right is given, the value for left is taken for that. | 213 | * If no value for right is given, the value for left is taken for that. |
210 | */ | 214 | */ |
211 | void setVolume( const QString& channel, int left, int right = -1 ); | 215 | void setVolume( const QString& channel, int left, int right = -1 ); |
212 | /** | 216 | /** |
213 | * @returns the volume of @a channel or -1, if the channel doesn't exist. | 217 | * @returns the volume of @a channel or -1, if the channel doesn't exist. |
214 | * @note You might want to use @ref hasChannel() to check if a channel exists. | 218 | * @note You might want to use @ref hasChannel() to check if a channel exists. |
215 | */ | 219 | */ |
216 | int volume( const QString& channel ) const; | 220 | int volume( const QString& channel ) const; |
217 | 221 | ||
218 | protected: | 222 | protected: |
219 | int _fd; | 223 | int _fd; |
220 | QMap<QString, int> _channels; | 224 | QMap<QString, int> _channels; |
221 | 225 | ||