View | Details | Raw Unified | Return to bug 251125 | Differences between
and this patch

Collapse All | Expand All

(-)b/solaris/oss/JackOSSDriver.cpp (-13 / +25 lines)
Lines 249-254 int JackOSSDriver::OpenInput() Link Here
249
{
249
{
250
    int flags = 0;
250
    int flags = 0;
251
    int gFragFormat;
251
    int gFragFormat;
252
    int fragment_size = 0;
252
    int cur_capture_channels;
253
    int cur_capture_channels;
253
    int cur_sample_format;
254
    int cur_sample_format;
254
    jack_nframes_t cur_sample_rate;
255
    jack_nframes_t cur_sample_rate;
Lines 276-282 int JackOSSDriver::OpenInput() Link Here
276
        jack_info("JackOSSDriver::OpenInput driver forced the number of capture channels %ld", fCaptureChannels);
277
        jack_info("JackOSSDriver::OpenInput driver forced the number of capture channels %ld", fCaptureChannels);
277
    }
278
    }
278
279
279
    gFragFormat = (2 << 16) + int2pow2(fEngineControl->fBufferSize * fSampleSize * fCaptureChannels);
280
    fInputBufferSize = fEngineControl->fBufferSize * fSampleSize * fCaptureChannels;
281
    gFragFormat = (2 << 16) + int2pow2(fInputBufferSize);
282
    if (!fIgnoreHW && (1 << (gFragFormat & 0x1f)) - fInputBufferSize >= fSampleSize * fCaptureChannels) {
283
        // Not a power of 2 buffer size, request 8 quarter fragments for steady operation.
284
        gFragFormat = (8 << 16) + int2pow2(fInputBufferSize >> 2);
285
    }
280
    if (ioctl(fInFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) {
286
    if (ioctl(fInFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) {
281
        jack_error("JackOSSDriver::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
287
        jack_error("JackOSSDriver::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
282
        goto error;
288
        goto error;
Lines 300-316 int JackOSSDriver::OpenInput() Link Here
300
        jack_info("JackOSSDriver::OpenInput driver forced the sample rate %ld", fEngineControl->fSampleRate);
306
        jack_info("JackOSSDriver::OpenInput driver forced the sample rate %ld", fEngineControl->fSampleRate);
301
    }
307
    }
302
308
303
    fInputBufferSize = 0;
309
    if (ioctl(fInFD, SNDCTL_DSP_GETBLKSIZE, &fragment_size) == -1) {
304
    if (ioctl(fInFD, SNDCTL_DSP_GETBLKSIZE, &fInputBufferSize) == -1) {
305
        jack_error("JackOSSDriver::OpenInput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
310
        jack_error("JackOSSDriver::OpenInput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
306
        goto error;
311
        goto error;
307
    }
312
    }
308
313
309
    if (fInputBufferSize < fEngineControl->fBufferSize * fSampleSize * fCaptureChannels) {
314
    if ((gFragFormat >> 16) == 2 && fragment_size != fInputBufferSize) {
310
       if (fIgnoreHW) {
315
       if (fIgnoreHW) {
311
           int new_buffer_size = fInputBufferSize / (fSampleSize * fCaptureChannels);
316
           int new_buffer_size = fragment_size / (fSampleSize * fCaptureChannels);
312
           jack_info("JackOSSDriver::OpenInput driver forced buffer size %ld", new_buffer_size);
317
           jack_info("JackOSSDriver::OpenInput driver forced buffer size %ld", new_buffer_size);
313
           JackAudioDriver::SetBufferSize(new_buffer_size); // never fails
318
           JackAudioDriver::SetBufferSize(new_buffer_size); // never fails
319
           fInputBufferSize = fEngineControl->fBufferSize * fSampleSize * fCaptureChannels;
314
       } else {
320
       } else {
315
           jack_error("JackOSSDriver::OpenInput wanted buffer size cannot be obtained");
321
           jack_error("JackOSSDriver::OpenInput wanted buffer size cannot be obtained");
316
           goto error;
322
           goto error;
Lines 330-335 int JackOSSDriver::OpenOutput() Link Here
330
{
336
{
331
    int flags = 0;
337
    int flags = 0;
332
    int gFragFormat;
338
    int gFragFormat;
339
    int fragment_size = 0;
333
    int cur_sample_format;
340
    int cur_sample_format;
334
    int cur_playback_channels;
341
    int cur_playback_channels;
335
    jack_nframes_t cur_sample_rate;
342
    jack_nframes_t cur_sample_rate;
Lines 350-356 int JackOSSDriver::OpenOutput() Link Here
350
        }
357
        }
351
    }
358
    }
352
359
353
    gFragFormat = (2 << 16) + int2pow2(fEngineControl->fBufferSize * fSampleSize * fPlaybackChannels);
360
    fOutputBufferSize = fEngineControl->fBufferSize * fSampleSize * fPlaybackChannels;
361
    gFragFormat = (2 << 16) + int2pow2(fOutputBufferSize);
362
    if (!fIgnoreHW && (1 << (gFragFormat & 0x1f)) - fOutputBufferSize >= fSampleSize * fCaptureChannels) {
363
        // Not a power of 2 buffer size, request 8 quarter fragments for steady operation.
364
        gFragFormat = (8 << 16) + int2pow2(fOutputBufferSize >> 2);
365
    }
354
    if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) {
366
    if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) {
355
        jack_error("JackOSSDriver::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
367
        jack_error("JackOSSDriver::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
356
        goto error;
368
        goto error;
Lines 380-401 int JackOSSDriver::OpenOutput() Link Here
380
        goto error;
392
        goto error;
381
    }
393
    }
382
    if (cur_sample_rate != fEngineControl->fSampleRate) {
394
    if (cur_sample_rate != fEngineControl->fSampleRate) {
383
        jack_info("JackOSSDriver::OpenInput driver forced the sample rate %ld", fEngineControl->fSampleRate);
395
        jack_info("JackOSSDriver::OpenOutput driver forced the sample rate %ld", fEngineControl->fSampleRate);
384
    }
396
    }
385
397
386
    fOutputBufferSize = 0;
398
    if (ioctl(fOutFD, SNDCTL_DSP_GETBLKSIZE, &fragment_size) == -1) {
387
    if (ioctl(fOutFD, SNDCTL_DSP_GETBLKSIZE, &fOutputBufferSize) == -1) {
388
        jack_error("JackOSSDriver::OpenOutput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
399
        jack_error("JackOSSDriver::OpenOutput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno);
389
        goto error;
400
        goto error;
390
    }
401
    }
391
402
392
    if (fOutputBufferSize < fEngineControl->fBufferSize * fSampleSize * fPlaybackChannels) {
403
    if ((gFragFormat >> 16) == 2 && fragment_size != fOutputBufferSize) {
393
       if (fIgnoreHW) {
404
       if (fIgnoreHW) {
394
           int new_buffer_size = fOutputBufferSize / (fSampleSize * fPlaybackChannels);
405
           int new_buffer_size = fragment_size / (fSampleSize * fPlaybackChannels);
395
           jack_info("JackOSSDriver::OpenOutput driver forced buffer size %ld", new_buffer_size);
406
           jack_info("JackOSSDriver::OpenOutput driver forced buffer size %ld", new_buffer_size);
396
           JackAudioDriver::SetBufferSize(new_buffer_size); // never fails
407
           JackAudioDriver::SetBufferSize(new_buffer_size); // never fails
408
           fOutputBufferSize = fEngineControl->fBufferSize * fSampleSize * fPlaybackChannels;
397
       } else {
409
       } else {
398
           jack_error("JackOSSDriver::OpenInput wanted buffer size cannot be obtained");
410
           jack_error("JackOSSDriver::OpenOutput wanted buffer size cannot be obtained");
399
           goto error;
411
           goto error;
400
       }
412
       }
401
    }
413
    }
Lines 860-866 SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke Link Here
860
            break;
872
            break;
861
873
862
        case 'b':
874
        case 'b':
863
            ignorehwbuf = true;
875
            ignorehwbuf = (bool)param->value.i;
864
            break;
876
            break;
865
877
866
        case 'e':
878
        case 'e':

Return to bug 251125