VirtualBox

Changeset 1947 in vbox for trunk/src


Ignore:
Timestamp:
Apr 5, 2007 11:09:18 AM (18 years ago)
Author:
vboxsync
Message:

fix for #1850 (ALSA on AMD64 was croaking)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/alsaaudio.c

    r1071 r1947  
    9898    audfmt_e fmt;
    9999    int nchannels;
    100     unsigned int buffer_size;
    101     unsigned int period_size;
     100    unsigned long buffer_size;
     101    unsigned long period_size;
    102102};
    103103
     
    269269    snd_pcm_t *handle;
    270270    snd_pcm_hw_params_t *hw_params;
    271     int err;
     271    int err, dir;
    272272    unsigned int freq, nchannels;
    273273    const char *pcm_name = in ? conf.pcm_name_in : conf.pcm_name_out;
    274274    unsigned int period_size, buffer_size;
    275     snd_pcm_uframes_t obt_buffer_size;
     275    snd_pcm_uframes_t period_size_f, buffer_size_f;
     276    snd_pcm_uframes_t obt_buffer_size, obt_period_size;
    276277    const char *typ = in ? "ADC" : "DAC";
    277278
     
    279280    period_size = req->period_size;
    280281    buffer_size = req->buffer_size;
     282    period_size_f = (snd_pcm_uframes_t)period_size;
     283    buffer_size_f = (snd_pcm_uframes_t)buffer_size;
    281284    nchannels = req->nchannels;
    282285
     
    415418        }
    416419        else {
    417             int dir;
    418420            snd_pcm_uframes_t minval;
    419421
    420             if (period_size) {
    421                 minval = period_size;
     422            if (period_size_f) {
     423                minval = period_size_f;
    422424                dir = 0;
    423425
     
    440442                else {
    441443                    dolog("minimal period size %ld\n", minval);
    442                     if (period_size < minval) {
     444                    if (period_size_f < minval) {
    443445                        if ((in && conf.period_size_in_overriden)
    444446                            || (!in && conf.period_size_out_overriden)) {
     
    446448                                   "than minmal period size(%ld)\n",
    447449                                   typ,
    448                                    period_size,
     450                                   period_size_f,
    449451                                   minval);
    450452                        }
    451                         period_size = minval;
     453                        period_size_f = minval;
    452454                    }
    453455                }
     
    457459                    handle,
    458460                    hw_params,
    459                     period_size,
     461                    period_size_f,
    460462                    0
    461463                    );
     
    464466                    handle,
    465467                    hw_params,
    466                     (snd_pcm_uframes_t*)&period_size,
     468                    &period_size_f,
    467469                    0
    468470                    );
    469471#endif
    470                 dolog("PERIOD_SIZE %d\n", period_size);
     472                dolog("PERIOD_SIZE %d\n", period_size_f);
    471473                if (err < 0) {
    472474#ifndef VBOX
    473475                    alsa_logerr2 (err, typ, "Failed to set period size %d\n",
    474                                   period_size);
     476                                  period_size_f);
    475477#else
    476478                    LogRel(("ALSA: Failed to set period size %d (%s)\n",
    477                             period_size, snd_strerror(err)));
     479                            period_size_f, snd_strerror(err)));
    478480#endif
    479481                    goto err;
     
    484486            /* Calculate default buffer size here since it might have been changed
    485487             * in the _near functions */
    486             buffer_size = 4 * period_size;
    487 #endif
    488 
    489             minval = buffer_size;
     488            buffer_size_f = 4 * period_size_f;
     489#endif
     490
     491            minval = buffer_size_f;
    490492            err = snd_pcm_hw_params_get_buffer_size_min (
    491493                hw_params,
     
    501503            }
    502504            else {
    503                 if (buffer_size < minval) {
     505                if (buffer_size_f < minval) {
    504506                    if ((in && conf.buffer_size_in_overriden)
    505507                        || (!in && conf.buffer_size_out_overriden)) {
     
    508510                            "than minimal buffer size(%ld)\n",
    509511                            typ,
    510                             buffer_size,
     512                            buffer_size_f,
    511513                            minval
    512514                            );
    513515                    }
    514                     buffer_size = minval;
     516                    buffer_size_f = minval;
    515517                }
    516518            }
     
    519521                handle,
    520522                hw_params,
    521                 (snd_pcm_uframes_t*)&buffer_size
     523                &buffer_size_f
    522524                );
    523             dolog("BUFFER_SIZE %d\n", buffer_size);
     525            dolog("BUFFER_SIZE %d\n", buffer_size_f);
    524526            if (err < 0) {
    525527#ifndef VBOX
    526528                alsa_logerr2 (err, typ, "Failed to set buffer size %d\n",
    527                               buffer_size);
     529                              buffer_size_f);
    528530#else
    529531                LogRel(("ALSA: Failed to set buffer size %d (%s)\n",
    530                         buffer_size, snd_strerror(err)));
     532                        buffer_size_f, snd_strerror(err)));
    531533#endif
    532534                goto err;
     
    559561
    560562#ifdef VBOX
    561     LogRel(("ALSA: %s frequency %dHz, period size %d, buffer size %d\n",
    562              typ, req->freq, period_size, obt_buffer_size));
     563    dir = 0;
     564    err = snd_pcm_hw_params_get_period_size (hw_params, &obt_period_size, &dir);
     565    if (err < 0)
     566    {
     567        LogRel(("ALSA: Failed to get period size\n"));
     568        goto err;
     569    }
     570    LogRel(("ALSA: %s frequency %dHz, period size %ld, buffer size %ld\n",
     571             typ, req->freq, obt_period_size, obt_buffer_size));
    563572#endif
    564573
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette