44
55#include <fcntl.h>
66#include <sys/soundcard.h>
7+ #include <unistd.h>
78
89const char * ffDetectSound (FFlist * devices )
910{
10- char path [] = "/dev/mixer0" ;
11+ #ifndef __NetBSD__
1112 int defaultDev = ffSysctlGetInt ("hw.snd.default_unit" , -1 );
12-
1313 if (defaultDev == -1 )
1414 return "sysctl(hw.snd.default_unit) failed" ;
15+ #else
16+ int defaultDev ;
17+ {
18+ char mixerp [8 ];
19+ if (readlink ("/dev/mixer" , mixerp , ARRAY_SIZE (mixerp )) != 6 )
20+ return "readlink(/dev/mixer) failed" ;
21+ defaultDev = mixerp [5 ] - '0' ;
22+ if (defaultDev < 0 || defaultDev > 9 )
23+ return "Invalid mixer device" ;
24+ }
25+ #endif
26+
27+ char path [] = "/dev/mixer0" ;
1528
1629 struct oss_sysinfo info = { .nummixers = 9 };
1730
@@ -33,8 +46,11 @@ const char* ffDetectSound(FFlist* devices)
3346 if (!(devmask & SOUND_MASK_VOLUME ))
3447 continue ;
3548
49+ #if defined(SOUND_MIXER_MUTE ) && (SOUND_MIXER_MUTE != SOUND_MIXER_NONE )
50+ #define FF_SOUND_HAVE_MIXER_MUTE 1
3651 uint32_t mutemask = 0 ;
37- ioctl (fd , SOUND_MIXER_READ_MUTE , & mutemask ); // doesn't seem to be available on DragonFly
52+ ioctl (fd , SOUND_MIXER_READ_MUTE , & mutemask );
53+ #endif
3854
3955 struct oss_card_info ci = { .card = idev };
4056 if (ioctl (fd , SNDCTL_CARDINFO , & ci ) < 0 )
@@ -49,9 +65,11 @@ const char* ffDetectSound(FFlist* devices)
4965 ffStrbufInitF (& device -> name , "%s %s" , ci .longname , ci .hw_info );
5066 ffStrbufTrimRightSpace (& device -> name );
5167 ffStrbufInitF (& device -> platformApi , "%s %s" , info .product , info .version );
52- device -> volume = mutemask & SOUND_MASK_VOLUME
53- ? 0
54- : ((uint8_t ) volume /*left*/ + (uint8_t ) (volume >> 8 ) /*right*/ ) / 2 ;
68+ device -> volume =
69+ #ifdef FF_SOUND_HAVE_MIXER_MUTE
70+ mutemask & SOUND_MASK_VOLUME ? 0 :
71+ #endif
72+ ((uint8_t ) volume /*left*/ + (uint8_t ) (volume >> 8 ) /*right*/ ) / 2 ;
5573 device -> active = true;
5674 device -> main = defaultDev == idev ;
5775 }
0 commit comments