diff options
author | vb160487 <none@none> | 2006-10-04 02:02:35 -0700 |
---|---|---|
committer | vb160487 <none@none> | 2006-10-04 02:02:35 -0700 |
commit | a9373739f3f0d2b3ce603d100a38deb4093b7a3c (patch) | |
tree | 7ae84d81397b5e5ee26d26e31c39e94d2870dc09 /usr/src | |
parent | 4ea7dae1114f3b869ff647ce9b848239d705308d (diff) | |
download | illumos-joyent-a9373739f3f0d2b3ce603d100a38deb4093b7a3c.tar.gz |
6464603 panic in mixer:am_get_samples() during audio playback, mixer turned off
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/audio/sada/mixer/am_ad.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c b/usr/src/uts/common/io/audio/sada/mixer/am_ad.c index b253945e21..55459eb734 100644 --- a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c +++ b/usr/src/uts/common/io/audio/sada/mixer/am_ad.c @@ -3029,6 +3029,7 @@ am_get_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop, int i; int max_chs; int ret_val; + size_t size = samples << AM_INT32_SHIFT; ATRACE("in am_get_audio_trad_compat()", statep); @@ -3103,6 +3104,29 @@ am_get_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop, return (0); } + /* make sure the buffer is big enough */ + if (chpptr->acp_psb_size < size) { + ATRACE_32("am_get_audio_trad_compat() freeing buffer", + chpptr->acp_psb_size); + if (chpptr->acp_play_samp_buf) { + /* free the old buffer */ + kmem_free(chpptr->acp_play_samp_buf, + chpptr->acp_psb_size); + } + chpptr->acp_play_samp_buf = kmem_alloc(size, KM_NOSLEEP); + if (chpptr->acp_play_samp_buf == NULL) { + ATRACE_32("am_get_audio_trad_compat() " + "kmem_alloc() play_samp_buf failed", i); + audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, + "am_get_audio_trad_compat() " + "sample buffer %d not allocated", i); + chpptr->acp_psb_size = 0; + mutex_exit(&chptr->ch_lock); + return (0); + } + chpptr->acp_psb_size = size; + } + ATRACE_32("am_get_audio_trad_compat() calling am_get_samples()", samples); @@ -3461,11 +3485,7 @@ am_get_samples(audio_ch_t *chptr, int samples, void *buf, int mode) mute = info->output_muted; if (mute) { /* we return zeros */ - if (mode == AM_COMPAT_MODE) - bytes_needed = samples << AM_INT16_SHIFT; - else /* mixer mode */ - bytes_needed = samples << AM_INT32_SHIFT; - + bytes_needed = samples << AM_INT32_SHIFT; ATRACE("am_get_samples() bzero", buf); bzero(buf, bytes_needed); } |