Revision 2c44375d hw/ac97.c

b/hw/ac97.c
158 158
    SWVoiceIn *voice_pi;
159 159
    SWVoiceOut *voice_po;
160 160
    SWVoiceIn *voice_mc;
161
    int invalid_freq[3];
161 162
    uint8_t silence[128];
162 163
    uint32_t base[2];
163 164
    int bup_flag;
......
360 361
    as.fmt = AUD_FMT_S16;
361 362
    as.endianness = 0;
362 363

  
363
    switch (index) {
364
    case PI_INDEX:
365
        s->voice_pi = AUD_open_in (
366
            &s->card,
367
            s->voice_pi,
368
            "ac97.pi",
369
            s,
370
            pi_callback,
371
            &as
372
            );
373
        break;
364
    if (freq > 0) {
365
        s->invalid_freq[index] = 0;
366
        switch (index) {
367
        case PI_INDEX:
368
            s->voice_pi = AUD_open_in (
369
                &s->card,
370
                s->voice_pi,
371
                "ac97.pi",
372
                s,
373
                pi_callback,
374
                &as
375
                );
376
            break;
374 377

  
375
    case PO_INDEX:
376
        s->voice_po = AUD_open_out (
377
            &s->card,
378
            s->voice_po,
379
            "ac97.po",
380
            s,
381
            po_callback,
382
            &as
383
            );
384
        break;
378
        case PO_INDEX:
379
            s->voice_po = AUD_open_out (
380
                &s->card,
381
                s->voice_po,
382
                "ac97.po",
383
                s,
384
                po_callback,
385
                &as
386
                );
387
            break;
385 388

  
386
    case MC_INDEX:
387
        s->voice_mc = AUD_open_in (
388
            &s->card,
389
            s->voice_mc,
390
            "ac97.mc",
391
            s,
392
            mc_callback,
393
            &as
394
            );
395
        break;
389
        case MC_INDEX:
390
            s->voice_mc = AUD_open_in (
391
                &s->card,
392
                s->voice_mc,
393
                "ac97.mc",
394
                s,
395
                mc_callback,
396
                &as
397
                );
398
            break;
399
        }
400
    }
401
    else {
402
        s->invalid_freq[index] = freq;
403
        switch (index) {
404
        case PI_INDEX:
405
            AUD_close_in (&s->card, s->voice_pi);
406
            s->voice_pi = NULL;
407
            break;
408

  
409
        case PO_INDEX:
410
            AUD_close_out (&s->card, s->voice_po);
411
            s->voice_po = NULL;
412
            break;
413

  
414
        case MC_INDEX:
415
            AUD_close_in (&s->card, s->voice_mc);
416
            s->voice_mc = NULL;
417
            break;
418
        }
396 419
    }
397 420
}
398 421

  
......
1065 1088
    AC97BusMasterRegs *r = &s->bm_regs[index];
1066 1089
    int written = 0, stop = 0;
1067 1090

  
1091
    if (s->invalid_freq[index]) {
1092
        AUD_log ("ac97", "attempt to use voice %d with invalid frequency %d\n",
1093
                 index, s->invalid_freq[index]);
1094
        return;
1095
    }
1096

  
1068 1097
    if (r->sr & SR_DCH) {
1069 1098
        if (r->cr & CR_RPBM) {
1070 1099
            switch (index) {

Also available in: Unified diff