Skip to content

Commit 7bae257

Browse files
committed
Added --enable-oss-cookedmode configure argument to force SNDCTL_DSP_COOKEDMODE=1 on OSS.
Previous default of SNDCTL_DSP_COOKEDMODE=0 allowed some hardware to work with mismatched sample rate.
1 parent cb654ad commit 7bae257

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

configure.ac

+15
Original file line numberDiff line numberDiff line change
@@ -821,14 +821,28 @@ AM_CONDITIONAL(HAVE_COREAUDIO, $HAVE_COREAUDIO)
821821
AC_ARG_ENABLE(oss, AC_HELP_STRING([--disable-oss],[ignore OSS driver ]),
822822
TRY_OSS=$enableval , TRY_OSS=yes )
823823
HAVE_OSS="false"
824+
USE_OSS_COOKEDMODE="false"
824825
if test "x$TRY_OSS" = "xyes"
825826
then
826827
# check for Open Sound System
827828
AC_CHECK_HEADER([sys/soundcard.h],
828829
[HAVE_OSS="true"
829830
JACK_DEFAULT_DRIVER=\"oss\"])
831+
832+
# enable OSS cookedmode to allow hardware with mismatching sample rates
833+
if test "x$HAVE_OSS" = "xtrue"
834+
then
835+
AC_ARG_ENABLE(oss-cookedmode, AC_HELP_STRING([--enable-oss-cookedmode],[Enable cooked mode in OSS to accommodate hardware with mismatching sample rate]),
836+
ENABLE_OSS_COOKEDMODE=$enableval, ENABLE_OSS_COOKEDMODE=no)
837+
if test "x$ENABLE_OSS_COOKEDMODE" = "xyes"
838+
then
839+
USE_OSS_COOKEDMODE=true
840+
AC_DEFINE(USE_OSS_COOKEDMODE, 1, [Enable cooked mode in OSS to accommodate hardware with mismatching sample rate])
841+
fi
842+
fi
830843
fi
831844
AM_CONDITIONAL(HAVE_OSS, $HAVE_OSS)
845+
AM_CONDITIONAL(USE_OSS_COOKEDMODE, $USE_OSS_COOKEDMODE)
832846

833847
AC_ARG_ENABLE(sun, AC_HELP_STRING([--disable-sun],[ignore Sun driver ]),
834848
TRY_SUN=$enableval , TRY_SUN=yes )
@@ -1008,6 +1022,7 @@ echo \| Build with ALSA support............................... : $HAVE_ALSA
10081022
echo \| Build with old FireWire \(FreeBob\) support............. : $HAVE_FREEBOB
10091023
echo \| Build with new FireWire \(FFADO\) support............... : $HAVE_FIREWIRE
10101024
echo \| Build with OSS support................................ : $HAVE_OSS
1025+
echo \| Enable OSS COOKEDMODE for hardware flexibility........ : $USE_OSS_COOKEDMODE
10111026
echo \| Build with Sun audio support.......................... : $HAVE_SUN
10121027
echo \| Build with Sndio audio support........................ : $HAVE_SNDIO
10131028
echo \| Build with CoreAudio support.......................... : $HAVE_COREAUDIO

drivers/oss/oss_driver.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,11 @@ static int oss_driver_detach (oss_driver_t *driver, jack_engine_t *engine)
429429

430430
static int oss_driver_start (oss_driver_t *driver)
431431
{
432-
int flags = 0;
432+
#if defined(USE_OSS_COOKEDMODE)
433+
int cookedmode = 1;
434+
#else
435+
int cookedmode = 0;
436+
#endif
433437
int format;
434438
int channels;
435439
int samplerate;
@@ -464,7 +468,7 @@ static int oss_driver_start (oss_driver_t *driver)
464468
indev, __FILE__, __LINE__, errno);
465469
}
466470
#ifndef OSS_NO_COOKED_MODE
467-
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
471+
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &cookedmode);
468472
#endif
469473
fragsize = driver->period_size *
470474
driver->capture_channels * samplesize;
@@ -479,7 +483,7 @@ static int oss_driver_start (oss_driver_t *driver)
479483
outdev, __FILE__, __LINE__, errno);
480484
}
481485
#ifndef OSS_NO_COOKED_MODE
482-
ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &flags);
486+
ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &cookedmode);
483487
#endif
484488
fragsize = driver->period_size *
485489
driver->playback_channels * samplesize;
@@ -497,7 +501,7 @@ static int oss_driver_start (oss_driver_t *driver)
497501
return -1;
498502
}
499503
#ifndef OSS_NO_COOKED_MODE
500-
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
504+
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &cookedmode);
501505
#endif
502506
} else if (driver->capture_channels == 0 &&
503507
driver->playback_channels != 0) {
@@ -510,7 +514,7 @@ static int oss_driver_start (oss_driver_t *driver)
510514
return -1;
511515
}
512516
#ifndef OSS_NO_COOKED_MODE
513-
ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &flags);
517+
ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &cookedmode);
514518
#endif
515519
} else {
516520
infd = outfd = open (indev, O_RDWR | O_EXCL);
@@ -521,7 +525,7 @@ static int oss_driver_start (oss_driver_t *driver)
521525
return -1;
522526
}
523527
#ifndef OSS_NO_COOKED_MODE
524-
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
528+
ioctl (infd, SNDCTL_DSP_COOKEDMODE, &cookedmode);
525529
#endif
526530
}
527531
if (infd >= 0 && outfd >= 0) {

0 commit comments

Comments
 (0)