Lines Matching refs:st

135 #define B_SIZE sizeof(st->buf)
136 #define B_MASK (sizeof(st->buf) - 1)
183 HDAAudioStream st[4]; member
193 static inline uint32_t hda_bytes_per_second(HDAAudioStream *st) in hda_bytes_per_second() argument
195 return 2 * (uint32_t)st->as.nchannels * (uint32_t)st->as.freq; in hda_bytes_per_second()
198 static inline void hda_timer_sync_adjust(HDAAudioStream *st, int64_t target_pos) in hda_timer_sync_adjust() argument
216 trace_hda_audio_adjust(st->node->name, target_pos); in hda_timer_sync_adjust()
217 st->buft_start += corr; in hda_timer_sync_adjust()
222 HDAAudioStream *st = opaque; in hda_audio_input_timer() local
226 int64_t uptime = now - st->buft_start; in hda_audio_input_timer()
227 int64_t wpos = st->wpos; in hda_audio_input_timer()
228 int64_t rpos = st->rpos; in hda_audio_input_timer()
236 wanted_rpos = muldiv64(uptime, hda_bytes_per_second(st), in hda_audio_input_timer()
250 &st->state->hda, st->stream, false, st->buf + start, chunk); in hda_audio_input_timer()
256 st->rpos += chunk; in hda_audio_input_timer()
261 if (st->running) { in hda_audio_input_timer()
262 timer_mod_anticipate_ns(st->buft, now + HDA_TIMER_TICKS); in hda_audio_input_timer()
268 HDAAudioStream *st = opaque; in hda_audio_input_cb() local
270 int64_t wpos = st->wpos; in hda_audio_input_cb()
271 int64_t rpos = st->rpos; in hda_audio_input_cb()
278 uint32_t read = AUD_read(st->voice.in, st->buf + start, chunk); in hda_audio_input_cb()
281 st->wpos += read; in hda_audio_input_cb()
287 hda_timer_sync_adjust(st, -((wpos - rpos) - (B_SIZE >> 1))); in hda_audio_input_cb()
292 HDAAudioStream *st = opaque; in hda_audio_output_timer() local
296 int64_t uptime = now - st->buft_start; in hda_audio_output_timer()
297 int64_t wpos = st->wpos; in hda_audio_output_timer()
298 int64_t rpos = st->rpos; in hda_audio_output_timer()
306 wanted_wpos = muldiv64(uptime, hda_bytes_per_second(st), in hda_audio_output_timer()
320 &st->state->hda, st->stream, true, st->buf + start, chunk); in hda_audio_output_timer()
326 st->wpos += chunk; in hda_audio_output_timer()
331 if (st->running) { in hda_audio_output_timer()
332 timer_mod_anticipate_ns(st->buft, now + HDA_TIMER_TICKS); in hda_audio_output_timer()
338 HDAAudioStream *st = opaque; in hda_audio_output_cb() local
340 int64_t wpos = st->wpos; in hda_audio_output_cb()
341 int64_t rpos = st->rpos; in hda_audio_output_cb()
347 st->rpos = 0; in hda_audio_output_cb()
348 st->wpos = 0; in hda_audio_output_cb()
349 st->buft_start = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); in hda_audio_output_cb()
350 trace_hda_audio_overrun(st->node->name); in hda_audio_output_cb()
357 uint32_t written = AUD_write(st->voice.out, st->buf + start, chunk); in hda_audio_output_cb()
360 st->rpos += written; in hda_audio_output_cb()
366 hda_timer_sync_adjust(st, (wpos - rpos) - (B_SIZE >> 1)); in hda_audio_output_cb()
371 HDAAudioStream *st = opaque; in hda_audio_compat_input_cb() local
376 while (avail - recv >= sizeof(st->compat_buf)) { in hda_audio_compat_input_cb()
377 if (st->compat_bpos != sizeof(st->compat_buf)) { in hda_audio_compat_input_cb()
378 len = AUD_read(st->voice.in, st->compat_buf + st->compat_bpos, in hda_audio_compat_input_cb()
379 sizeof(st->compat_buf) - st->compat_bpos); in hda_audio_compat_input_cb()
380 st->compat_bpos += len; in hda_audio_compat_input_cb()
382 if (st->compat_bpos != sizeof(st->compat_buf)) { in hda_audio_compat_input_cb()
386 rc = hda_codec_xfer(&st->state->hda, st->stream, false, in hda_audio_compat_input_cb()
387 st->compat_buf, sizeof(st->compat_buf)); in hda_audio_compat_input_cb()
391 st->compat_bpos = 0; in hda_audio_compat_input_cb()
397 HDAAudioStream *st = opaque; in hda_audio_compat_output_cb() local
402 while (avail - sent >= sizeof(st->compat_buf)) { in hda_audio_compat_output_cb()
403 if (st->compat_bpos == sizeof(st->compat_buf)) { in hda_audio_compat_output_cb()
404 rc = hda_codec_xfer(&st->state->hda, st->stream, true, in hda_audio_compat_output_cb()
405 st->compat_buf, sizeof(st->compat_buf)); in hda_audio_compat_output_cb()
409 st->compat_bpos = 0; in hda_audio_compat_output_cb()
411 len = AUD_write(st->voice.out, st->compat_buf + st->compat_bpos, in hda_audio_compat_output_cb()
412 sizeof(st->compat_buf) - st->compat_bpos); in hda_audio_compat_output_cb()
413 st->compat_bpos += len; in hda_audio_compat_output_cb()
415 if (st->compat_bpos != sizeof(st->compat_buf)) { in hda_audio_compat_output_cb()
421 static void hda_audio_set_running(HDAAudioStream *st, bool running) in hda_audio_set_running() argument
423 if (st->node == NULL) { in hda_audio_set_running()
426 if (st->running == running) { in hda_audio_set_running()
429 st->running = running; in hda_audio_set_running()
430 trace_hda_audio_running(st->node->name, st->stream, st->running); in hda_audio_set_running()
431 if (st->state->use_timer) { in hda_audio_set_running()
434 st->rpos = 0; in hda_audio_set_running()
435 st->wpos = 0; in hda_audio_set_running()
436 st->buft_start = now; in hda_audio_set_running()
437 timer_mod_anticipate_ns(st->buft, now + HDA_TIMER_TICKS); in hda_audio_set_running()
439 timer_del(st->buft); in hda_audio_set_running()
442 if (st->output) { in hda_audio_set_running()
443 AUD_set_active_out(st->voice.out, st->running); in hda_audio_set_running()
445 AUD_set_active_in(st->voice.in, st->running); in hda_audio_set_running()
449 static void hda_audio_set_amp(HDAAudioStream *st) in hda_audio_set_amp() argument
454 if (st->node == NULL) { in hda_audio_set_amp()
458 muted = st->mute_left && st->mute_right; in hda_audio_set_amp()
459 left = st->mute_left ? 0 : st->gain_left; in hda_audio_set_amp()
460 right = st->mute_right ? 0 : st->gain_right; in hda_audio_set_amp()
465 if (!st->state->mixer) { in hda_audio_set_amp()
468 if (st->output) { in hda_audio_set_amp()
469 AUD_set_volume_out(st->voice.out, muted, left, right); in hda_audio_set_amp()
471 AUD_set_volume_in(st->voice.in, muted, left, right); in hda_audio_set_amp()
475 static void hda_audio_setup(HDAAudioStream *st) in hda_audio_setup() argument
477 bool use_timer = st->state->use_timer; in hda_audio_setup()
480 if (st->node == NULL) { in hda_audio_setup()
484 trace_hda_audio_format(st->node->name, st->as.nchannels, in hda_audio_setup()
485 fmt2name[st->as.fmt], st->as.freq); in hda_audio_setup()
487 if (st->output) { in hda_audio_setup()
490 st->buft = timer_new_ns(QEMU_CLOCK_VIRTUAL, in hda_audio_setup()
491 hda_audio_output_timer, st); in hda_audio_setup()
495 st->voice.out = AUD_open_out(&st->state->card, st->voice.out, in hda_audio_setup()
496 st->node->name, st, cb, &st->as); in hda_audio_setup()
500 st->buft = timer_new_ns(QEMU_CLOCK_VIRTUAL, in hda_audio_setup()
501 hda_audio_input_timer, st); in hda_audio_setup()
505 st->voice.in = AUD_open_in(&st->state->card, st->voice.in, in hda_audio_setup()
506 st->node->name, st, cb, &st->as); in hda_audio_setup()
513 HDAAudioStream *st; in hda_audio_command() local
578 st = a->st + node->stindex; in hda_audio_command()
579 if (st->node == NULL) { in hda_audio_command()
582 hda_audio_set_running(st, false); in hda_audio_command()
583 st->stream = (payload >> 4) & 0x0f; in hda_audio_command()
584 st->channel = payload & 0x0f; in hda_audio_command()
586 st->node->name, st->stream, st->channel); in hda_audio_command()
587 hda_audio_set_running(st, a->running_real[st->output * 16 + st->stream]); in hda_audio_command()
591 st = a->st + node->stindex; in hda_audio_command()
592 if (st->node == NULL) { in hda_audio_command()
595 response = st->stream << 4 | st->channel; in hda_audio_command()
599 st = a->st + node->stindex; in hda_audio_command()
600 if (st->node == NULL) { in hda_audio_command()
603 st->format = payload; in hda_audio_command()
604 hda_codec_parse_fmt(st->format, &st->as); in hda_audio_command()
605 hda_audio_setup(st); in hda_audio_command()
609 st = a->st + node->stindex; in hda_audio_command()
610 if (st->node == NULL) { in hda_audio_command()
613 hda_codec_response(hda, true, st->format); in hda_audio_command()
616 st = a->st + node->stindex; in hda_audio_command()
617 if (st->node == NULL) { in hda_audio_command()
621 response = st->gain_left | (st->mute_left ? AC_AMP_MUTE : 0); in hda_audio_command()
623 response = st->gain_right | (st->mute_right ? AC_AMP_MUTE : 0); in hda_audio_command()
628 st = a->st + node->stindex; in hda_audio_command()
629 if (st->node == NULL) { in hda_audio_command()
633 st->node->name, in hda_audio_command()
642 st->gain_left = payload & AC_AMP_GAIN; in hda_audio_command()
643 st->mute_left = payload & AC_AMP_MUTE; in hda_audio_command()
646 st->gain_right = payload & AC_AMP_GAIN; in hda_audio_command()
647 st->mute_right = payload & AC_AMP_MUTE; in hda_audio_command()
649 hda_audio_set_amp(st); in hda_audio_command()
677 for (s = 0; s < ARRAY_SIZE(a->st); s++) { in hda_audio_stream()
678 if (a->st[s].node == NULL) { in hda_audio_stream()
681 if (a->st[s].output != output) { in hda_audio_stream()
684 if (a->st[s].stream != stnr) { in hda_audio_stream()
687 hda_audio_set_running(&a->st[s], running); in hda_audio_stream()
696 HDAAudioStream *st; in hda_audio_init() local
719 assert(node->stindex < ARRAY_SIZE(a->st)); in hda_audio_init()
720 st = a->st + node->stindex; in hda_audio_init()
721 st->state = a; in hda_audio_init()
722 st->node = node; in hda_audio_init()
725 st->gain_left = QEMU_HDA_AMP_STEPS; in hda_audio_init()
726 st->gain_right = QEMU_HDA_AMP_STEPS; in hda_audio_init()
727 st->compat_bpos = sizeof(st->compat_buf); in hda_audio_init()
728 st->output = true; in hda_audio_init()
730 st->output = false; in hda_audio_init()
732 st->format = AC_FMT_TYPE_PCM | AC_FMT_BITS_16 | in hda_audio_init()
734 hda_codec_parse_fmt(st->format, &st->as); in hda_audio_init()
735 hda_audio_setup(st); in hda_audio_init()
744 HDAAudioStream *st; in hda_audio_exit() local
748 for (i = 0; i < ARRAY_SIZE(a->st); i++) { in hda_audio_exit()
749 st = a->st + i; in hda_audio_exit()
750 if (st->node == NULL) { in hda_audio_exit()
754 timer_del(st->buft); in hda_audio_exit()
756 if (st->output) { in hda_audio_exit()
757 AUD_close_out(&a->card, st->voice.out); in hda_audio_exit()
759 AUD_close_in(&a->card, st->voice.in); in hda_audio_exit()
768 HDAAudioStream *st; in hda_audio_post_load() local
778 for (i = 0; i < ARRAY_SIZE(a->st); i++) { in hda_audio_post_load()
779 st = a->st + i; in hda_audio_post_load()
780 if (st->node == NULL) in hda_audio_post_load()
782 hda_codec_parse_fmt(st->format, &st->as); in hda_audio_post_load()
783 hda_audio_setup(st); in hda_audio_post_load()
784 hda_audio_set_amp(st); in hda_audio_post_load()
785 hda_audio_set_running(st, a->running_real[st->output * 16 + st->stream]); in hda_audio_post_load()
793 HDAAudioStream *st; in hda_audio_reset() local
797 for (i = 0; i < ARRAY_SIZE(a->st); i++) { in hda_audio_reset()
798 st = a->st + i; in hda_audio_reset()
799 if (st->node != NULL) { in hda_audio_reset()
800 hda_audio_set_running(st, false); in hda_audio_reset()
807 HDAAudioStream *st = opaque; in vmstate_hda_audio_stream_buf_needed() local
808 return st->state && st->state->use_timer; in vmstate_hda_audio_stream_buf_needed()
851 VMSTATE_STRUCT_ARRAY(st, HDAAudioState, 4, 0,