summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorvb160487 <none@none>2006-10-04 02:02:35 -0700
committervb160487 <none@none>2006-10-04 02:02:35 -0700
commita9373739f3f0d2b3ce603d100a38deb4093b7a3c (patch)
tree7ae84d81397b5e5ee26d26e31c39e94d2870dc09 /usr/src
parent4ea7dae1114f3b869ff647ce9b848239d705308d (diff)
downloadillumos-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.c30
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);
}