Commit 523111e7efb8ad61e1d91edebee1702a45873b04
1 parent
24859b68
Improve audio api use in WM8750.
These are changes from http://svn.openmoko.org/trunk/src/host/qemu-neo1973/hw/wm8753.c that I forgot to push to WM8750. Some were suggested by malc. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4249 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
15 additions
and
12 deletions
hw/wm8750.c
@@ -55,10 +55,10 @@ static inline void wm8750_in_load(struct wm8750_s *s) | @@ -55,10 +55,10 @@ static inline void wm8750_in_load(struct wm8750_s *s) | ||
55 | 55 | ||
56 | static inline void wm8750_out_flush(struct wm8750_s *s) | 56 | static inline void wm8750_out_flush(struct wm8750_s *s) |
57 | { | 57 | { |
58 | - int sent; | ||
59 | - if (!s->idx_out) | ||
60 | - return; | ||
61 | - sent = AUD_write(*s->out[0], s->data_out, s->idx_out); | 58 | + int sent = 0; |
59 | + while (sent < s->idx_out) | ||
60 | + sent += AUD_write(*s->out[0], s->data_out + sent, s->idx_out - sent) | ||
61 | + ?: s->idx_out; | ||
62 | s->idx_out = 0; | 62 | s->idx_out = 0; |
63 | } | 63 | } |
64 | 64 | ||
@@ -67,19 +67,20 @@ static void wm8750_audio_in_cb(void *opaque, int avail_b) | @@ -67,19 +67,20 @@ static void wm8750_audio_in_cb(void *opaque, int avail_b) | ||
67 | struct wm8750_s *s = (struct wm8750_s *) opaque; | 67 | struct wm8750_s *s = (struct wm8750_s *) opaque; |
68 | s->req_in = avail_b; | 68 | s->req_in = avail_b; |
69 | s->data_req(s->opaque, s->req_out >> 2, avail_b >> 2); | 69 | s->data_req(s->opaque, s->req_out >> 2, avail_b >> 2); |
70 | - | ||
71 | -#if 0 | ||
72 | - wm8750_in_load(s); | ||
73 | -#endif | ||
74 | } | 70 | } |
75 | 71 | ||
76 | static void wm8750_audio_out_cb(void *opaque, int free_b) | 72 | static void wm8750_audio_out_cb(void *opaque, int free_b) |
77 | { | 73 | { |
78 | struct wm8750_s *s = (struct wm8750_s *) opaque; | 74 | struct wm8750_s *s = (struct wm8750_s *) opaque; |
79 | 75 | ||
80 | - s->req_out = free_b; | ||
81 | - s->data_req(s->opaque, free_b >> 2, s->req_in >> 2); | ||
82 | - wm8750_out_flush(s); | 76 | + if (s->idx_out >= free_b) { |
77 | + s->idx_out = free_b; | ||
78 | + s->req_out = 0; | ||
79 | + wm8750_out_flush(s); | ||
80 | + } else | ||
81 | + s->req_out = free_b - s->idx_out; | ||
82 | + | ||
83 | + s->data_req(s->opaque, s->req_out >> 2, s->req_in >> 2); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | struct wm_rate_s { | 86 | struct wm_rate_s { |
@@ -121,7 +122,7 @@ static const struct wm_rate_s wm_rate_table[] = { | @@ -121,7 +122,7 @@ static const struct wm_rate_s wm_rate_table[] = { | ||
121 | { 512, 24000, 512, 24000 }, /* SR: 11100 */ | 122 | { 512, 24000, 512, 24000 }, /* SR: 11100 */ |
122 | { 768, 24000, 768, 24000 }, /* SR: 11101 */ | 123 | { 768, 24000, 768, 24000 }, /* SR: 11101 */ |
123 | { 128, 88200, 128, 88200 }, /* SR: 11110 */ | 124 | { 128, 88200, 128, 88200 }, /* SR: 11110 */ |
124 | - { 192, 88200, 128, 88200 }, /* SR: 11111 */ | 125 | + { 192, 88200, 192, 88200 }, /* SR: 11111 */ |
125 | }; | 126 | }; |
126 | 127 | ||
127 | static void wm8750_set_format(struct wm8750_s *s) | 128 | static void wm8750_set_format(struct wm8750_s *s) |
@@ -597,6 +598,7 @@ i2c_slave *wm8750_init(i2c_bus *bus, AudioState *audio) | @@ -597,6 +598,7 @@ i2c_slave *wm8750_init(i2c_bus *bus, AudioState *audio) | ||
597 | return &s->i2c; | 598 | return &s->i2c; |
598 | } | 599 | } |
599 | 600 | ||
601 | +#if 0 | ||
600 | static void wm8750_fini(i2c_slave *i2c) | 602 | static void wm8750_fini(i2c_slave *i2c) |
601 | { | 603 | { |
602 | struct wm8750_s *s = (struct wm8750_s *) i2c; | 604 | struct wm8750_s *s = (struct wm8750_s *) i2c; |
@@ -604,6 +606,7 @@ static void wm8750_fini(i2c_slave *i2c) | @@ -604,6 +606,7 @@ static void wm8750_fini(i2c_slave *i2c) | ||
604 | AUD_remove_card(&s->card); | 606 | AUD_remove_card(&s->card); |
605 | qemu_free(s); | 607 | qemu_free(s); |
606 | } | 608 | } |
609 | +#endif | ||
607 | 610 | ||
608 | void wm8750_data_req_set(i2c_slave *i2c, | 611 | void wm8750_data_req_set(i2c_slave *i2c, |
609 | void (*data_req)(void *, int, int), void *opaque) | 612 | void (*data_req)(void *, int, int), void *opaque) |