qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [4321] First cut at WM8750 volume control (Jan Kiszka).


From: Jan Kiszka
Subject: Re: [Qemu-devel] [4321] First cut at WM8750 volume control (Jan Kiszka).
Date: Sun, 04 May 2008 19:31:41 +0200
User-agent: Thunderbird 2.0.0.12 (X11/20080226)

andrzej zaborowski wrote:
> On 04/05/2008, andrzej zaborowski <address@hidden> wrote:
>> On 04/05/2008, Jan Kiszka <address@hidden> wrote:
>>  >  -#define NOVOL
>>  >  +//#define NOVOL
>>  >
>>  >   /* 8 bit */
>>  >   #define ENDIAN_CONVERSION natural
>>  >
>>  >  to make the MusicPal work out-of-the-box (muting is now broken again,
>>  >  causing loud noise during channel switches and while in suspended mode).
>>
>>
>> Right, as I said you need to disable NOVOL manually if you want volume
>>  control.  Changing this would affect users of all machines of all
>>  architectures and until now everyone was fine with using the host
>>  mixer instead of software mixing in qemu.
>>
>>  BTW, I noticed that on some radio stations I get double speed
>>  playback, not sure what's causing this.  My recent commit, while
>>  correct (I think), doesn't fix this.  For a test case try connecting
> 
> Ok, seems to be fixed now - it (logically) happened everytime Linux
> was trying to play a mono channel stream.

Cool! Just a minor nit (to avoid that the compiler gets upset):

Index: qemu/hw/musicpal.c
===================================================================
--- qemu/hw/musicpal.c  (Revision 4332)
+++ qemu/hw/musicpal.c  (Arbeitskopie)
@@ -255,7 +255,8 @@ typedef struct musicpal_audio_state {
 static void audio_callback(void *opaque, int free_out, int free_in)
 {
     musicpal_audio_state *s = opaque;
-    int16_t *codec_buffer, *mem_buffer;
+    int16_t *codec_buffer;
+    void *mem_buffer;
     int pos, block_size;
 
     if (!(s->playback_mode & MP_AUDIO_PLAYBACK_EN))
@@ -276,8 +277,9 @@ static void audio_callback(void *opaque,
         if (s->playback_mode & MP_AUDIO_MONO) {
             codec_buffer = wm8750_dac_buffer(s->wm, block_size >> 1);
             for (pos = 0; pos < block_size; pos += 2) {
-                *codec_buffer++ = *mem_buffer;
-                *codec_buffer++ = *mem_buffer++;
+                *codec_buffer++ = *(uint16_t *)mem_buffer;
+                *codec_buffer++ = *(uint16_t *)mem_buffer;
+                mem_buffer += 2;
             }
         } else
             memcpy(wm8750_dac_buffer(s->wm, block_size >> 2),
@@ -286,14 +288,14 @@ static void audio_callback(void *opaque,
         if (s->playback_mode & MP_AUDIO_MONO) {
             codec_buffer = wm8750_dac_buffer(s->wm, block_size);
             for (pos = 0; pos < block_size; pos++) {
-                *codec_buffer++ = cpu_to_le16(256 * *((int8_t *)mem_buffer));
-                *codec_buffer++ = cpu_to_le16(256 * *((int8_t *)mem_buffer)++);
+                *codec_buffer++ = cpu_to_le16(256 * *(int8_t *)mem_buffer);
+                *codec_buffer++ = cpu_to_le16(256 * *(int8_t *)mem_buffer++);
             }
         } else {
             codec_buffer = wm8750_dac_buffer(s->wm, block_size >> 1);
             for (pos = 0; pos < block_size; pos += 2) {
-                *codec_buffer++ = cpu_to_le16(256 * *((int8_t *)mem_buffer)++);
-                *codec_buffer++ = cpu_to_le16(256 * *((int8_t *)mem_buffer)++);
+                *codec_buffer++ = cpu_to_le16(256 * *(int8_t *)mem_buffer++);
+                *codec_buffer++ = cpu_to_le16(256 * *(int8_t *)mem_buffer++);
             }
         }
     }

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]