mirror of https://github.com/ericonr/sndio.git
Initialize client rate and channel ranges. Fixes crashes when the
client doesn't set the rate and/or channel ranges. Problem reported and analyzed by Dimitri Sokolyuk <sokolyuk at gmail.com>. Thanks!
This commit is contained in:
parent
343af5e469
commit
0f2025bd71
13
sndiod/dev.c
13
sndiod/dev.c
|
@ -1560,21 +1560,22 @@ found:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
s->mode = mode;
|
s->mode = mode;
|
||||||
s->par = d->par;
|
aparams_init(&s->par);
|
||||||
if (s->mode & MODE_PLAY) {
|
if (s->mode & MODE_PLAY) {
|
||||||
s->mix.slot_cmin = 0;
|
s->mix.slot_cmin = s->mix.dev_cmin = 0;
|
||||||
s->mix.slot_cmax = d->pchan - 1;
|
s->mix.slot_cmax = s->mix.dev_cmax = d->pchan - 1;
|
||||||
}
|
}
|
||||||
if (s->mode & MODE_RECMASK) {
|
if (s->mode & MODE_RECMASK) {
|
||||||
s->sub.slot_cmin = 0;
|
s->sub.slot_cmin = s->sub.dev_cmin = 0;
|
||||||
s->sub.slot_cmax = ((s->mode & MODE_MON) ?
|
s->sub.slot_cmax = s->sub.dev_cmax =
|
||||||
d->pchan : d->rchan) - 1;
|
((s->mode & MODE_MON) ? d->pchan : d->rchan) - 1;
|
||||||
}
|
}
|
||||||
s->xrun = XRUN_IGNORE;
|
s->xrun = XRUN_IGNORE;
|
||||||
s->dup = 0;
|
s->dup = 0;
|
||||||
s->appbufsz = d->bufsz;
|
s->appbufsz = d->bufsz;
|
||||||
s->round = d->round;
|
s->round = d->round;
|
||||||
s->rate = d->rate;
|
s->rate = d->rate;
|
||||||
|
s->mix.maxweight = ADATA_UNIT;
|
||||||
dev_midi_slotdesc(d, s);
|
dev_midi_slotdesc(d, s);
|
||||||
dev_midi_vol(d, s);
|
dev_midi_vol(d, s);
|
||||||
return s;
|
return s;
|
||||||
|
|
|
@ -670,13 +670,13 @@ sock_setpar(struct sock *f)
|
||||||
if (log_level >= 3) {
|
if (log_level >= 3) {
|
||||||
sock_log(f);
|
sock_log(f);
|
||||||
log_puts(": recording channels ");
|
log_puts(": recording channels ");
|
||||||
log_putu(s->sub.slot_cmin);
|
|
||||||
log_puts(":");
|
|
||||||
log_putu(s->sub.slot_cmax);
|
|
||||||
log_puts(" -> ");
|
|
||||||
log_putu(s->sub.dev_cmin);
|
log_putu(s->sub.dev_cmin);
|
||||||
log_puts(":");
|
log_puts(":");
|
||||||
log_putu(s->sub.dev_cmax);
|
log_putu(s->sub.dev_cmax);
|
||||||
|
log_puts(" -> ");
|
||||||
|
log_putu(s->sub.slot_cmin);
|
||||||
|
log_puts(":");
|
||||||
|
log_putu(s->sub.slot_cmax);
|
||||||
log_puts("\n");
|
log_puts("\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -907,14 +907,13 @@ sock_hello(struct sock *f)
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
f->midi = NULL;
|
f->midi = NULL;
|
||||||
aparams_init(&s->par);
|
|
||||||
if (s->mode & MODE_PLAY) {
|
if (s->mode & MODE_PLAY) {
|
||||||
s->mix.slot_cmin = f->opt->pmin;
|
s->mix.slot_cmin = s->mix.dev_cmin = f->opt->pmin;
|
||||||
s->mix.slot_cmax = f->opt->pmax;
|
s->mix.slot_cmax = s->mix.dev_cmax = f->opt->pmax;
|
||||||
}
|
}
|
||||||
if (s->mode & MODE_RECMASK) {
|
if (s->mode & MODE_RECMASK) {
|
||||||
s->sub.slot_cmin = f->opt->rmin;
|
s->sub.slot_cmin = s->sub.dev_cmin = f->opt->rmin;
|
||||||
s->sub.slot_cmax = f->opt->rmax;
|
s->sub.slot_cmax = s->sub.dev_cmax = f->opt->rmax;
|
||||||
}
|
}
|
||||||
if (f->opt->mmc) {
|
if (f->opt->mmc) {
|
||||||
s->xrun = XRUN_SYNC;
|
s->xrun = XRUN_SYNC;
|
||||||
|
|
Loading…
Reference in New Issue