Lines Matching refs:e

153 auimpl_engine_reset(audio_engine_t *e)  in auimpl_engine_reset()  argument
160 tidx = e->e_tidx; in auimpl_engine_reset()
161 nfr = min(e->e_head - e->e_tail, e->e_nframes); in auimpl_engine_reset()
162 buf = kmem_alloc(nfr * e->e_framesz, KM_SLEEP); in auimpl_engine_reset()
166 ASSERT(e->e_nframes); in auimpl_engine_reset()
171 cnt = min((e->e_nframes - tidx), resid); in auimpl_engine_reset()
172 nbytes = cnt * e->e_framesz; in auimpl_engine_reset()
174 bcopy(e->e_data + (tidx * e->e_framesz), ptr, nbytes); in auimpl_engine_reset()
177 if (tidx == e->e_nframes) { in auimpl_engine_reset()
182 if (e->e_flags & ENGINE_INPUT) { in auimpl_engine_reset()
184 e->e_hidx = 0; in auimpl_engine_reset()
185 e->e_tidx = (e->e_nframes - nfr) % e->e_nframes; in auimpl_engine_reset()
188 e->e_hidx = nfr % e->e_nframes; in auimpl_engine_reset()
189 e->e_tidx = 0; in auimpl_engine_reset()
193 bcopy(buf, e->e_data + (e->e_tidx * e->e_framesz), nfr * e->e_framesz); in auimpl_engine_reset()
194 kmem_free(buf, nfr * e->e_framesz); in auimpl_engine_reset()
203 audio_engine_t *e; in audio_engine_alloc() local
214 e = kmem_zalloc(sizeof (audio_engine_t), KM_NOSLEEP); in audio_engine_alloc()
215 if (e == NULL) { in audio_engine_alloc()
219 e->e_ops = *ops; in audio_engine_alloc()
220 mutex_init(&e->e_lock, NULL, MUTEX_DRIVER, in audio_engine_alloc()
222 cv_init(&e->e_cv, NULL, CV_DRIVER, NULL); in audio_engine_alloc()
223 list_create(&e->e_streams, sizeof (struct audio_stream), in audio_engine_alloc()
227 e->e_chbufs[i] = kmem_zalloc(sizeof (int32_t) * AUDIO_CHBUFS, in audio_engine_alloc()
229 if (e->e_chbufs[i] == NULL) { in audio_engine_alloc()
231 audio_engine_free(e); in audio_engine_alloc()
240 e->e_flags = flags & ENGINE_DRIVER_FLAGS; in audio_engine_alloc()
241 return (e); in audio_engine_alloc()
245 audio_engine_free(audio_engine_t *e) in audio_engine_free() argument
250 if (e->e_chbufs[i] != NULL) { in audio_engine_free()
251 kmem_free(e->e_chbufs[i], in audio_engine_free()
256 list_destroy(&e->e_streams); in audio_engine_free()
257 mutex_destroy(&e->e_lock); in audio_engine_free()
258 cv_destroy(&e->e_cv); in audio_engine_free()
259 kmem_free(e, sizeof (*e)); in audio_engine_free()
374 audio_engine_t *e = NULL; in auimpl_engine_setup() local
595 if (e != NULL) { in auimpl_engine_setup()
601 if (list_is_empty(&e->e_streams)) in auimpl_engine_setup()
602 ENG_CLOSE(e); in auimpl_engine_setup()
603 mutex_exit(&e->e_lock); in auimpl_engine_setup()
605 e = t; in auimpl_engine_setup()
618 ASSERT(e == NULL); in auimpl_engine_setup()
627 ASSERT(e == NULL); in auimpl_engine_setup()
632 ASSERT(e != NULL); in auimpl_engine_setup()
633 ASSERT(mutex_owned(&e->e_lock)); in auimpl_engine_setup()
635 if (sp->s_engine && (sp->s_engine != e)) { in auimpl_engine_setup()
645 if (list_is_empty(&e->e_streams)) in auimpl_engine_setup()
646 ENG_CLOSE(e); in auimpl_engine_setup()
647 mutex_exit(&e->e_lock); in auimpl_engine_setup()
661 sp->s_engine = e; in auimpl_engine_setup()
663 if (!list_is_empty(&e->e_streams)) { in auimpl_engine_setup()
670 list_insert_tail(&e->e_streams, sp); in auimpl_engine_setup()
673 list_insert_tail(&e->e_streams, sp); in auimpl_engine_setup()
676 ASSERT(sp->s_engine == e); in auimpl_engine_setup()
684 e->e_format = ENG_FORMAT(e); in auimpl_engine_setup()
685 e->e_nchan = ENG_CHANNELS(e); in auimpl_engine_setup()
686 e->e_rate = ENG_RATE(e); in auimpl_engine_setup()
689 switch (e->e_format) { in auimpl_engine_setup()
691 e->e_export = auimpl_export_24ne; in auimpl_engine_setup()
692 e->e_import = auimpl_import_24ne; in auimpl_engine_setup()
696 e->e_export = auimpl_export_32ne; in auimpl_engine_setup()
697 e->e_import = auimpl_import_32ne; in auimpl_engine_setup()
701 e->e_export = auimpl_export_24oe; in auimpl_engine_setup()
702 e->e_import = auimpl_import_24oe; in auimpl_engine_setup()
706 e->e_export = auimpl_export_32oe; in auimpl_engine_setup()
707 e->e_import = auimpl_import_32oe; in auimpl_engine_setup()
711 e->e_export = auimpl_export_16ne; in auimpl_engine_setup()
712 e->e_import = auimpl_import_16ne; in auimpl_engine_setup()
716 e->e_export = auimpl_export_16oe; in auimpl_engine_setup()
717 e->e_import = auimpl_import_16oe; in auimpl_engine_setup()
721 e->e_export = auimpl_export_24ne; in auimpl_engine_setup()
722 e->e_import = auimpl_import_24ne; in auimpl_engine_setup()
732 fragfr = e->e_rate / audio_intrhz; in auimpl_engine_setup()
740 if ((e->e_nchan < 0) || (e->e_nchan > AUDIO_MAX_CHANNELS) || in auimpl_engine_setup()
741 (e->e_rate < 5000) || (e->e_rate > 192000)) { in auimpl_engine_setup()
747 if ((e->e_nframes <= (fragfr * 2)) || (e->e_data == NULL)) { in auimpl_engine_setup()
753 e->e_framesz = e->e_nchan * sampsz; in auimpl_engine_setup()
754 e->e_fragfr = fragfr; in auimpl_engine_setup()
755 e->e_head = 0; in auimpl_engine_setup()
756 e->e_tail = 0; in auimpl_engine_setup()
757 e->e_hidx = 0; in auimpl_engine_setup()
758 e->e_tidx = 0; in auimpl_engine_setup()
759 e->e_limiter_state = 0x10000; in auimpl_engine_setup()
760 bzero(e->e_data, e->e_nframes * e->e_framesz); in auimpl_engine_setup()
762 if (e->e_ops.audio_engine_playahead == NULL) { in auimpl_engine_setup()
763 e->e_playahead = (fragfr * 3) / 2; in auimpl_engine_setup()
765 e->e_playahead = ENG_PLAYAHEAD(e); in auimpl_engine_setup()
770 if (e->e_playahead < ((fragfr * 3) / 2)) { in auimpl_engine_setup()
771 e->e_playahead = (fragfr * 3) / 2; in auimpl_engine_setup()
777 if (e->e_playahead > e->e_nframes) { in auimpl_engine_setup()
778 e->e_playahead = (fragfr * 3) / 2; in auimpl_engine_setup()
782 for (i = 0; i < e->e_nchan; i++) { in auimpl_engine_setup()
783 if (e->e_ops.audio_engine_chinfo == NULL) { in auimpl_engine_setup()
784 e->e_choffs[i] = i; in auimpl_engine_setup()
785 e->e_chincr[i] = e->e_nchan; in auimpl_engine_setup()
787 ENG_CHINFO(e, i, &e->e_choffs[i], &e->e_chincr[i]); in auimpl_engine_setup()
791 e->e_flags |= flags; in auimpl_engine_setup()
802 e->e_need_start = B_TRUE; in auimpl_engine_setup()
810 auimpl_output_preload(e); in auimpl_engine_setup()
812 e->e_periodic = ddi_periodic_add(auimpl_output_callback, e, in auimpl_engine_setup()
815 e->e_periodic = ddi_periodic_add(auimpl_input_callback, e, in auimpl_engine_setup()
820 sp->s_phys_parms->p_rate = e->e_rate; in auimpl_engine_setup()
821 sp->s_phys_parms->p_nchan = e->e_nchan; in auimpl_engine_setup()
829 mutex_exit(&e->e_lock); in auimpl_engine_setup()
838 audio_engine_t *e = sp->s_engine; in auimpl_engine_close() local
842 if (e == NULL) in auimpl_engine_close()
845 d = e->e_dev; in auimpl_engine_close()
853 mutex_enter(&e->e_lock); in auimpl_engine_close()
855 list_remove(&e->e_streams, sp); in auimpl_engine_close()
856 if (list_is_empty(&e->e_streams)) { in auimpl_engine_close()
857 ENG_STOP(e); in auimpl_engine_close()
858 ep = e->e_periodic; in auimpl_engine_close()
859 e->e_periodic = 0; in auimpl_engine_close()
860 e->e_flags &= ENGINE_DRIVER_FLAGS; in auimpl_engine_close()
861 ENG_CLOSE(e); in auimpl_engine_close()
863 mutex_exit(&e->e_lock); in auimpl_engine_close()
967 audio_engine_t *e = ksp->ks_private; in auimpl_engine_ksupdate() local
968 struct audio_stats *st = &e->e_stats; in auimpl_engine_ksupdate()
974 mutex_enter(&e->e_lock); in auimpl_engine_ksupdate()
975 st->st_head.value.ui64 = e->e_head; in auimpl_engine_ksupdate()
976 st->st_tail.value.ui64 = e->e_tail; in auimpl_engine_ksupdate()
977 st->st_flags.value.ui32 = e->e_flags; in auimpl_engine_ksupdate()
978 st->st_nbytes.value.ui32 = e->e_framesz * e->e_nframes; in auimpl_engine_ksupdate()
979 st->st_framesz.value.ui32 = e->e_framesz; in auimpl_engine_ksupdate()
980 st->st_hidx.value.ui32 = e->e_hidx; in auimpl_engine_ksupdate()
981 st->st_tidx.value.ui32 = e->e_tidx; in auimpl_engine_ksupdate()
982 st->st_format.value.ui32 = e->e_format; in auimpl_engine_ksupdate()
983 st->st_nchan.value.ui32 = e->e_nchan; in auimpl_engine_ksupdate()
984 st->st_rate.value.ui32 = e->e_rate; in auimpl_engine_ksupdate()
985 st->st_errors.value.ui32 = e->e_errors; in auimpl_engine_ksupdate()
986 st->st_engine_underruns.value.ui32 = e->e_underruns; in auimpl_engine_ksupdate()
987 st->st_engine_overruns.value.ui32 = e->e_overruns; in auimpl_engine_ksupdate()
988 st->st_stream_underruns.value.ui32 = e->e_stream_underruns; in auimpl_engine_ksupdate()
989 st->st_stream_overruns.value.ui32 = e->e_stream_overruns; in auimpl_engine_ksupdate()
990 st->st_suspended.value.ui32 = e->e_suspended; in auimpl_engine_ksupdate()
991 st->st_failed.value.ui32 = e->e_failed; in auimpl_engine_ksupdate()
992 st->st_playahead.value.ui32 = e->e_playahead; in auimpl_engine_ksupdate()
993 mutex_exit(&e->e_lock); in auimpl_engine_ksupdate()
999 auimpl_engine_ksinit(audio_dev_t *d, audio_engine_t *e) in auimpl_engine_ksinit() argument
1004 (void) snprintf(name, sizeof (name), "engine_%d", e->e_num); in auimpl_engine_ksinit()
1006 e->e_ksp = kstat_create(ddi_driver_name(d->d_dip), d->d_instance, in auimpl_engine_ksinit()
1010 if (e->e_ksp == NULL) { in auimpl_engine_ksinit()
1015 st = &e->e_stats; in auimpl_engine_ksinit()
1016 e->e_ksp->ks_data = st; in auimpl_engine_ksinit()
1017 e->e_ksp->ks_private = e; in auimpl_engine_ksinit()
1018 e->e_ksp->ks_lock = NULL; in auimpl_engine_ksinit()
1019 e->e_ksp->ks_update = auimpl_engine_ksupdate; in auimpl_engine_ksinit()
1042 kstat_install(e->e_ksp); in auimpl_engine_ksinit()
1046 audio_dev_add_engine(audio_dev_t *d, audio_engine_t *e) in audio_dev_add_engine() argument
1050 e->e_num = d->d_engno++; in audio_dev_add_engine()
1052 auimpl_engine_ksinit(d, e); in audio_dev_add_engine()
1055 if ((e->e_flags & ENGINE_OUTPUT_CAP) && (d->d_flags & DEV_INPUT_CAP)) { in audio_dev_add_engine()
1058 if ((e->e_flags & ENGINE_INPUT_CAP) && (d->d_flags & DEV_OUTPUT_CAP)) { in audio_dev_add_engine()
1062 if (e->e_flags & ENGINE_OUTPUT_CAP) { in audio_dev_add_engine()
1065 if (e->e_flags & ENGINE_INPUT_CAP) { in audio_dev_add_engine()
1069 list_insert_tail(&d->d_engines, e); in audio_dev_add_engine()
1070 e->e_dev = d; in audio_dev_add_engine()
1075 audio_dev_remove_engine(audio_dev_t *d, audio_engine_t *e) in audio_dev_remove_engine() argument
1078 list_remove(&d->d_engines, e); in audio_dev_remove_engine()
1079 e->e_dev = NULL; in audio_dev_remove_engine()
1080 if (e->e_ksp) in audio_dev_remove_engine()
1081 kstat_delete(e->e_ksp); in audio_dev_remove_engine()
1082 e->e_ksp = NULL; in audio_dev_remove_engine()
1148 audio_engine_t *e; in auclnt_dev_walk_engines() local
1152 for (e = list_head(l); e != NULL; e = list_next(l, e)) { in auclnt_dev_walk_engines()
1153 if (walker(e, arg) == AUDIO_WALK_STOP) { in auclnt_dev_walk_engines()
1161 auclnt_engine_get_format(audio_engine_t *e) in auclnt_engine_get_format() argument
1163 return (ENG_FORMAT(e)); in auclnt_engine_get_format()
1167 auclnt_engine_get_channels(audio_engine_t *e) in auclnt_engine_get_channels() argument
1169 return (ENG_CHANNELS(e)); in auclnt_engine_get_channels()
1173 auclnt_engine_get_rate(audio_engine_t *e) in auclnt_engine_get_rate() argument
1175 return (ENG_RATE(e)); in auclnt_engine_get_rate()
1179 auclnt_engine_get_capab(audio_engine_t *e) in auclnt_engine_get_capab() argument
1183 if (e->e_flags & ENGINE_INPUT_CAP) { in auclnt_engine_get_capab()
1186 if (e->e_flags & ENGINE_OUTPUT_CAP) { in auclnt_engine_get_capab()
1211 auimpl_engine_suspend(audio_engine_t *e) in auimpl_engine_suspend() argument
1213 ASSERT(mutex_owned(&e->e_lock)); in auimpl_engine_suspend()
1215 if (e->e_failed || e->e_suspended) { in auimpl_engine_suspend()
1216 e->e_suspended = B_TRUE; in auimpl_engine_suspend()
1219 e->e_suspended = B_TRUE; in auimpl_engine_suspend()
1220 if (e->e_flags & ENGINE_INPUT) { in auimpl_engine_suspend()
1221 e->e_head = ENG_COUNT(e); in auimpl_engine_suspend()
1222 ENG_STOP(e); in auimpl_engine_suspend()
1224 if (e->e_flags & ENGINE_OUTPUT) { in auimpl_engine_suspend()
1225 e->e_tail = ENG_COUNT(e); in auimpl_engine_suspend()
1226 ENG_STOP(e); in auimpl_engine_suspend()
1231 auimpl_engine_resume(audio_engine_t *e) in auimpl_engine_resume() argument
1233 ASSERT(mutex_owned(&e->e_lock)); in auimpl_engine_resume()
1234 ASSERT(e->e_suspended); in auimpl_engine_resume()
1236 if (e->e_failed) { in auimpl_engine_resume()
1238 e->e_suspended = B_FALSE; in auimpl_engine_resume()
1242 if (e->e_flags & (ENGINE_INPUT | ENGINE_OUTPUT)) { in auimpl_engine_resume()
1244 auimpl_engine_reset(e); in auimpl_engine_resume()
1246 if (e->e_flags & ENGINE_OUTPUT) { in auimpl_engine_resume()
1247 auimpl_output_preload(e); in auimpl_engine_resume()
1250 e->e_need_start = B_TRUE; in auimpl_engine_resume()
1252 e->e_suspended = B_FALSE; in auimpl_engine_resume()
1253 cv_broadcast(&e->e_cv); in auimpl_engine_resume()
1260 audio_engine_t *e; in auimpl_dev_suspend() local
1279 for (e = list_head(l); e != NULL; e = list_next(l, e)) { in auimpl_dev_suspend()
1280 mutex_enter(&e->e_lock); in auimpl_dev_suspend()
1281 auimpl_engine_suspend(e); in auimpl_dev_suspend()
1282 mutex_exit(&e->e_lock); in auimpl_dev_suspend()
1293 audio_engine_t *e; in auimpl_dev_resume() local
1313 for (e = list_head(l); e != NULL; e = list_next(l, e)) { in auimpl_dev_resume()
1314 mutex_enter(&e->e_lock); in auimpl_dev_resume()
1315 auimpl_engine_resume(e); in auimpl_dev_resume()
1316 mutex_exit(&e->e_lock); in auimpl_dev_resume()