Browse Source

- Fixed rounding

- Fixed full-duplex error case (4Front Technologies)
- More verbose error reporting (4Front Technologies)


git-svn-id: svn+ssh://jackaudio.org/trunk/jack@777 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.109.0
sonarnerd 21 years ago
parent
commit
f6d54994e0
1 changed files with 68 additions and 51 deletions
  1. +68
    -51
      drivers/oss/oss_driver.c

+ 68
- 51
drivers/oss/oss_driver.c View File

@@ -243,8 +243,10 @@ static void copy_and_convert_out (void *dst, jack_sample_t *src,
scale = 0x7fff;
for (srcidx = 0; srcidx < nframes; srcidx++)
{
s16dst[dstidx] = (signed short)
(src[srcidx] * scale + 0.5f);
s16dst[dstidx] = (signed short)
(src[srcidx] >= 0.0f) ?
(src[srcidx] * scale + 0.5f) :
(src[srcidx] * scale - 0.5f);
dstidx += chcount;
}
break;
@@ -253,7 +255,9 @@ static void copy_and_convert_out (void *dst, jack_sample_t *src,
for (srcidx = 0; srcidx < nframes; srcidx++)
{
s32dst[dstidx] = (signed int)
(src[srcidx] * scale + 0.5f);
(src[srcidx] >= 0.0f) ?
(src[srcidx] * scale + 0.5f) :
(src[srcidx] * scale - 0.5f);
dstidx += chcount;
}
break;
@@ -262,7 +266,9 @@ static void copy_and_convert_out (void *dst, jack_sample_t *src,
for (srcidx = 0; srcidx < nframes; srcidx++)
{
s32dst[dstidx] = (signed int)
(src[srcidx] * scale + 0.5f);
(src[srcidx] >= 0.0f) ?
(src[srcidx] * scale + 0.5f) :
(src[srcidx] * scale - 0.5f);
dstidx += chcount;
}
break;
@@ -286,8 +292,8 @@ static void set_fragment (int fd, size_t fragsize, unsigned int fragcount)
fragments = ((fragcount << 16) | (fragsize_2p & 0xffff));
if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fragments) < 0)
{
jack_error("OSS: failed to set fragment size: %s@%i",
__FILE__, __LINE__);
jack_error("OSS: failed to set fragment size: %s@%i, errno=%d",
__FILE__, __LINE__, errno);
}
}

@@ -298,8 +304,8 @@ static int get_fragment (int fd)

if (ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &fragsize) < 0)
{
jack_error("OSS: failed to get fragment size: %s@%i",
__FILE__, __LINE__);
jack_error("OSS: failed to get fragment size: %s@%i, errno=%d",
__FILE__, __LINE__, errno);
return 0;
}
return fragsize;
@@ -434,8 +440,8 @@ static int oss_driver_start (oss_driver_t *driver)
if (infd < 0)
{
jack_error(
"OSS: failed to open input device %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to open input device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
}
fragsize = driver->period_size *
driver->capture_channels * samplesize;
@@ -449,8 +455,8 @@ static int oss_driver_start (oss_driver_t *driver)
if (outfd < 0)
{
jack_error(
"OSS: failed to open output device %s: %s@%i",
outdev, __FILE__, __LINE__);
"OSS: failed to open output device %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
}
fragsize = driver->period_size *
driver->playback_channels * samplesize;
@@ -468,8 +474,8 @@ static int oss_driver_start (oss_driver_t *driver)
if (infd < 0)
{
jack_error(
"OSS: failed to open device %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to open device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
return -1;
}
}
@@ -481,8 +487,8 @@ static int oss_driver_start (oss_driver_t *driver)
if (outfd < 0)
{
jack_error(
"OSS: failed to open device %s: %s@%i",
outdev, __FILE__, __LINE__);
"OSS: failed to open device %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
return -1;
}
}
@@ -492,8 +498,8 @@ static int oss_driver_start (oss_driver_t *driver)
if (infd < 0)
{
jack_error(
"OSS: failed to open device %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to open device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
return -1;
}
}
@@ -501,9 +507,11 @@ static int oss_driver_start (oss_driver_t *driver)
{
if (ioctl(infd, SNDCTL_DSP_SETDUPLEX, 0) < 0)
{
jack_error(
"OSS: failed to enable full duplex for %s: %s@%i",
indev, __FILE__, __LINE__);
if (errno != EINVAL) /* Dont care */
jack_error(
"OSS: failed to enable full duplex for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__,
errno);
}
}
if (infd >= 0)
@@ -527,18 +535,18 @@ static int oss_driver_start (oss_driver_t *driver)
format = driver->format;
if (ioctl(infd, SNDCTL_DSP_SETFMT, &format) < 0)
jack_error(
"OSS: failed to set format for %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to set format for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
channels = driver->capture_channels;
if (ioctl(infd, SNDCTL_DSP_CHANNELS, &channels) < 0)
jack_error(
"OSS: failed to set channels for %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to set channels for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
samplerate = driver->sample_rate;
if (ioctl(infd, SNDCTL_DSP_SPEED, &samplerate) < 0)
jack_error(
"OSS: failed to set samplerate for %s: %s@%i",
indev, __FILE__, __LINE__);
"OSS: failed to set samplerate for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
printf("oss_driver: %s : 0x%x/%i/%i (%i)\n", indev,
format, channels, samplerate, get_fragment(infd));
@@ -562,18 +570,18 @@ static int oss_driver_start (oss_driver_t *driver)
format = driver->format;
if (ioctl(outfd, SNDCTL_DSP_SETFMT, &format) < 0)
jack_error(
"OSS: failed to set format for %s: %s@%i",
outdev, __FILE__, __LINE__);
"OSS: failed to set format for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
channels = driver->playback_channels;
if (ioctl(outfd, SNDCTL_DSP_CHANNELS, &channels) < 0)
jack_error(
"OSS: failed to set channels for %s: %s@%i",
outdev, __FILE__, __LINE__);
"OSS: failed to set channels for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
samplerate = driver->sample_rate;
if (ioctl(outfd, SNDCTL_DSP_SPEED, &samplerate) < 0)
jack_error(
"OSS: failed to set samplerate for %s: %s@%i",
outdev, __FILE__, __LINE__);
"OSS: failed to set samplerate for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
printf("oss_driver: %s : 0x%x/%i/%i (%i)\n", outdev,
format, channels, samplerate,
get_fragment(outfd));
@@ -877,6 +885,7 @@ static inline void synchronize (oss_driver_t *driver)
static void *io_thread (void *param)
{
size_t localsize;
ssize_t io_res;
void *localbuf;
oss_driver_t *driver = (oss_driver_t *) param;

@@ -896,11 +905,13 @@ static void *io_thread (void *param)

while (driver->run)
{
if (read(driver->infd, localbuf, localsize) <
(ssize_t) localsize)
io_res = read(driver->infd, localbuf, localsize);
if (io_res < (ssize_t) localsize)
{
jack_error("OSS: read() failed: %s@%i",
__FILE__, __LINE__);
jack_error(
"OSS: read() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res, localsize,
errno);
break;
}

@@ -930,11 +941,13 @@ static void *io_thread (void *param)
memcpy(localbuf, driver->outdevbuf, localsize);
pthread_mutex_unlock(&driver->mutex_out);

if (write(driver->outfd, localbuf, localsize) <
(ssize_t) localsize)
io_res = write(driver->outfd, localbuf, localsize);
if (io_res < (ssize_t) localsize)
{
jack_error("OSS: write() failed: %s@%i",
__FILE__, __LINE__);
jack_error(
"OSS: write() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res, localsize,
errno);
break;
}

@@ -962,24 +975,28 @@ static void *io_thread (void *param)
driver->outdevbufsize);
pthread_mutex_unlock(&driver->mutex_out);

if (write(driver->outfd, localbuf,
driver->outdevbufsize) <
(ssize_t) driver->outdevbufsize)
io_res = write(driver->outfd, localbuf,
driver->outdevbufsize);
if (io_res < (ssize_t) driver->outdevbufsize)
{
jack_error("OSS: write() failed: %s@%i",
__FILE__, __LINE__);
jack_error(
"OSS: write() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res,
driver->outdevbufsize, errno);
break;
}
}

if (driver->capture_channels > 0)
{
if (read(driver->infd, localbuf,
driver->indevbufsize) <
(ssize_t) driver->indevbufsize)
io_res = read(driver->infd, localbuf,
driver->indevbufsize);
if (io_res < (ssize_t) driver->indevbufsize)
{
jack_error("OSS: read() failed: %s@%i",
__FILE__, __LINE__);
jack_error(
"OSS: read() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res,
driver->indevbufsize, errno);
break;
}



Loading…
Cancel
Save