]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
8 ch audio support.
authorToni Wilen <twilen@winuae.net>
Sat, 16 Sep 2023 16:32:44 +0000 (19:32 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 16 Sep 2023 16:32:44 +0000 (19:32 +0300)
audio.cpp
cfgfile.cpp
include/audio.h
od-win32/sounddep/sound.cpp
od-win32/sounddep/sound.h
od-win32/win32gui.cpp

index 7127f51fdfe5adb695e9abd5efd2ea9fefd00b20..a47cbb632f53796d0c94e2228650c581fb5acdea 100644 (file)
--- a/audio.cpp
+++ b/audio.cpp
@@ -744,6 +744,80 @@ static void get_extra_channels_sample6(int *data1, int *data2, int *data3, int *
        }
 }
 
+static void set_sound_buffers(void)
+{
+#if SOUNDSTUFF > 1
+       paula_sndbufpt_prev = paula_sndbufpt_start;
+       paula_sndbufpt_start = paula_sndbufpt;
+#endif
+}
+
+static void clear_sound_buffers(void)
+{
+       memset(paula_sndbuffer, 0, paula_sndbufsize);
+       paula_sndbufpt = paula_sndbuffer;
+}
+
+static void check_sound_buffers(void)
+{
+#if SOUNDSTUFF > 1
+       int len;
+#endif
+
+       if (active_sound_stereo == SND_4CH_CLONEDSTEREO) {
+               ((uae_u16 *)paula_sndbufpt)[0] = ((uae_u16 *)paula_sndbufpt)[-2];
+               ((uae_u16 *)paula_sndbufpt)[1] = ((uae_u16 *)paula_sndbufpt)[-1];
+               paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2 * 2);
+       } else if (active_sound_stereo == SND_6CH_CLONEDSTEREO) {
+               uae_s16 *p = ((uae_s16 *)paula_sndbufpt);
+               uae_s32 sum;
+               p[2] = p[-2];
+               p[3] = p[-1];
+               sum = (uae_s32)(p[-2]) + (uae_s32)(p[-1]) + (uae_s32)(p[2]) + (uae_s32)(p[3]);
+               p[0] = sum / 8;
+               p[1] = sum / 8;
+               paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 4 * 2);
+       } else if (active_sound_stereo == SND_8CH_CLONEDSTEREO) {
+               uae_s16 *p = ((uae_s16 *)paula_sndbufpt);
+               uae_s32 sum;
+               p[2] = p[-2];
+               p[3] = p[-1];
+               p[4] = p[-2];
+               p[5] = p[-1];
+               sum = (uae_s32)(p[-2]) + (uae_s32)(p[-1]) + (uae_s32)(p[2]) + (uae_s32)(p[3]);
+               p[0] = sum / 8;
+               p[1] = sum / 8;
+               paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 6 * 2);
+       }
+#if SOUNDSTUFF > 1
+       if (outputsample == 0)
+               return;
+       len = paula_sndbufpt - paula_sndbufpt_start;
+       if (outputsample < 0) {
+               int i;
+               uae_s16 *p1 = (uae_s16 *)paula_sndbufpt_prev;
+               uae_s16 *p2 = (uae_s16 *)paula_sndbufpt_start;
+               for (i = 0; i < len; i++) {
+                       *p1 = (*p1 + *p2) / 2;
+               }
+               paula_sndbufpt = paula_sndbufpt_start;
+       }
+#endif
+       if ((uae_u8 *)paula_sndbufpt - (uae_u8 *)paula_sndbuffer >= paula_sndbufsize) {
+               finish_sound_buffer();
+       }
+#if SOUNDSTUFF > 1
+       while (doublesample-- > 0) {
+               memcpy(paula_sndbufpt, paula_sndbufpt_start, len * 2);
+               paula_sndbufpt += len;
+               if ((uae_u8 *)paula_sndbufpt - (uae_u8 *)paula_sndbuffer >= paula_sndbufsize) {
+                       finish_sound_buffer();
+                       paula_sndbufpt = paula_sndbuffer;
+               }
+       }
+#endif
+}
+
 static void sample16i_sinc_handler (void)
 {
        int datas[AUDIO_CHANNELS_PAULA], data1;
@@ -982,20 +1056,24 @@ void sample16ss_handler (void)
        do_filter(&data2, 3);
        do_filter(&data3, 2);
 
-       if (currprefs.sound_stereo == SND_6CH)
+       if (active_sound_stereo >= SND_6CH)
                make6ch(data0, data1, data2, data3, &data4, &data5);
 
        get_extra_channels_sample6(&data0, &data1, &data3, &data2, &data4, &data5, 0);
 
        set_sound_buffers ();
        put_sound_word_right(data0);
-       put_sound_word_left (data1);
-       if (currprefs.sound_stereo == SND_6CH) {
+       put_sound_word_left(data1);
+       if (active_sound_stereo >= SND_6CH) {
+               PUT_SOUND_WORD(data4);
+               PUT_SOUND_WORD(data5);
+       }
+       if (active_sound_stereo >= SND_8CH) {
                PUT_SOUND_WORD(data4);
                PUT_SOUND_WORD(data5);
        }
        put_sound_word_right2(data3);
-       put_sound_word_left2 (data2);
+       put_sound_word_left2(data2);
        check_sound_buffers ();
 }
 
@@ -1018,50 +1096,54 @@ static void sample16ss_anti_handler (void)
        do_filter(&data2, 3);
        do_filter(&data3, 2);
 
-       if (currprefs.sound_stereo == SND_6CH)
+       if (active_sound_stereo >= SND_6CH)
                make6ch(data0, data1, data2, data3, &data4, &data5);
 
        get_extra_channels_sample6(&data0, &data1, &data3, &data2, &data4, &data5, 0);
 
-       set_sound_buffers ();
+       set_sound_buffers();
        put_sound_word_right(data0);
-       put_sound_word_left (data1);
-       if (currprefs.sound_stereo == SND_6CH) {
+       put_sound_word_left(data1);
+       if (active_sound_stereo >= SND_6CH) {
+               PUT_SOUND_WORD(data4);
+               PUT_SOUND_WORD(data5);
+       }
+       if (active_sound_stereo >= SND_8CH) {
                PUT_SOUND_WORD(data4);
                PUT_SOUND_WORD(data5);
        }
        put_sound_word_right2(data3);
-       put_sound_word_left2 (data2);
-       check_sound_buffers ();
+       put_sound_word_left2(data2);
+       check_sound_buffers();
 }
 
-static void sample16si_anti_handler (void)
+static void sample16si_anti_handler(void)
 {
        int datas[AUDIO_CHANNELS_PAULA], data1, data2;
 
-       samplexx_anti_handler (datas, 0, AUDIO_CHANNELS_PAULA);
+       samplexx_anti_handler(datas, 0, AUDIO_CHANNELS_PAULA);
        data1 = datas[0] + datas[3];
        data2 = datas[1] + datas[2];
-       data1 = FINISH_DATA (data1, 15, 0);
-       data2 = FINISH_DATA (data2, 15, 1);
+       data1 = FINISH_DATA(data1, 15, 0);
+       data2 = FINISH_DATA(data2, 15, 1);
 
        do_filter(&data1, 0);
        do_filter(&data2, 1);
 
        get_extra_channels_sample2(&data1, &data2, 1);
 
-       set_sound_buffers ();
+       set_sound_buffers();
        put_sound_word_right(data1);
-       put_sound_word_left (data2);
-       check_sound_buffers ();
+       put_sound_word_left(data2);
+       check_sound_buffers();
 }
 
-static void sample16ss_sinc_handler (void)
+static void sample16ss_sinc_handler(void)
 {
        int data0, data1, data2, data3, data4, data5;
        int datas[AUDIO_CHANNELS_PAULA];
 
-       samplexx_sinc_handler (datas, 0, AUDIO_CHANNELS_PAULA);
+       samplexx_sinc_handler(datas, 0, AUDIO_CHANNELS_PAULA);
        data0 = FINISH_DATA (datas[0], 16, 0);
        data1 = FINISH_DATA (datas[1], 16, 0);
        data2 = FINISH_DATA (datas[2], 16, 1);
@@ -1072,7 +1154,7 @@ static void sample16ss_sinc_handler (void)
        do_filter(&data2, 3);
        do_filter(&data3, 2);
 
-       if (currprefs.sound_stereo == SND_6CH)
+       if (active_sound_stereo >= SND_6CH)
                make6ch(data0, data1, data2, data3, &data4, &data5);
 
        get_extra_channels_sample6(&data0, &data1, &data3, &data2, &data4, &data5, 0);
@@ -1080,7 +1162,11 @@ static void sample16ss_sinc_handler (void)
        set_sound_buffers ();
        put_sound_word_right(data0);
        put_sound_word_left (data1);
-       if (currprefs.sound_stereo == SND_6CH) {
+       if (active_sound_stereo >= SND_6CH) {
+               PUT_SOUND_WORD(data4);
+               PUT_SOUND_WORD(data5);
+       }
+       if (active_sound_stereo >= SND_8CH) {
                PUT_SOUND_WORD(data4);
                PUT_SOUND_WORD(data5);
        }
@@ -2034,6 +2120,7 @@ void set_audio (void)
        currprefs.produce_sound = changed_prefs.produce_sound;
        currprefs.win32_soundcard = changed_prefs.win32_soundcard;
        currprefs.sound_stereo = changed_prefs.sound_stereo;
+       active_sound_stereo = currprefs.sound_stereo;
        currprefs.sound_auto = changed_prefs.sound_auto;
        currprefs.sound_freq = changed_prefs.sound_freq;
        currprefs.sound_maxbsiz = changed_prefs.sound_maxbsiz;
index 55d91af9dc61e03958bb9c9bbaa3db5d7196449c..4896ef3ffaa9601426ab1342a4d646a5554d234e 100644 (file)
@@ -153,7 +153,7 @@ static const TCHAR *soundmode1[] = { _T("none"), _T("interrupts"), _T("normal"),
 static const TCHAR *soundmode2[] = { _T("none"), _T("interrupts"), _T("good"), _T("best"), 0 };
 static const TCHAR *centermode1[] = { _T("none"), _T("simple"), _T("smart"), 0 };
 static const TCHAR *centermode2[] = { _T("false"), _T("true"), _T("smart"), 0 };
-static const TCHAR *stereomode[] = { _T("mono"), _T("stereo"), _T("clonedstereo"), _T("4ch"), _T("clonedstereo6ch"), _T("6ch"), _T("mixed"), 0 };
+static const TCHAR *stereomode[] = { _T("mono"), _T("stereo"), _T("clonedstereo"), _T("4ch"), _T("clonedstereo6ch"), _T("6ch"),  _T("clonedstereo8ch"), _T("8ch"), _T("mixed"), 0 };
 static const TCHAR *interpolmode[] = { _T("none"), _T("anti"), _T("sinc"), _T("rh"), _T("crux"), 0 };
 static const TCHAR *collmode[] = { _T("none"), _T("sprites"), _T("playfields"), _T("full"), 0 };
 static const TCHAR *compmode[] = { _T("direct"), _T("indirect"), _T("indirectKS"), _T("afterPic"), 0 };
index eef61d5ec2a86e6d6f73c8f1cf53087c7c17e3d4..8e83544537da07e01851a3b19fdc814b18730f17 100644 (file)
@@ -83,6 +83,8 @@ enum {
        SND_4CH,
        SND_6CH_CLONEDSTEREO,
        SND_6CH,
+       SND_8CH_CLONEDSTEREO,
+       SND_8CH,
        SND_NONE
 };
 
@@ -98,19 +100,21 @@ static inline int get_audio_stereomode (int channels)
                return SND_4CH;
        case 6:
                return SND_6CH;
+       case 8:
+               return SND_8CH;
        }
        return SND_STEREO;
 }
 
 STATIC_INLINE int get_audio_nativechannels (int stereomode)
 {
-       int ch[] = { 1, 2, 4, 4, 6, 6, 0 };
+       int ch[] = { 1, 2, 4, 4, 6, 6, 8, 8, 0 };
        return ch[stereomode];
 }
 
 STATIC_INLINE int get_audio_amigachannels (int stereomode)
 {
-       int ch[] = { 1, 2, 2, 4, 2, 4, 0 };
+       int ch[] = { 1, 2, 2, 4, 2, 4, 2, 4, 0 };
        return ch[stereomode];
 }
 
index bc60e319bdae6756c65cc066b5ece641b6637f0c..c1c79d6baa6218f05e4befbde27c53934566c37c 100644 (file)
@@ -157,6 +157,7 @@ static int statuscnt;
 uae_u16 paula_sndbuffer[SND_MAX_BUFFER];
 uae_u16 *paula_sndbufpt;
 int paula_sndbufsize;
+int active_sound_stereo;
 
 static uae_sem_t sound_sem, sound_init_sem;
 
@@ -1376,13 +1377,17 @@ retry:
        rncnt = 0;
        for (;;) {
 
-               if (sd->channels == 6) {
-                       rn[0] = KSAUDIO_SPEAKER_5POINT1;
-                       rn[1] = KSAUDIO_SPEAKER_5POINT1_SURROUND;
+               if (sd->channels == 8) {
+                       rn[0] = KSAUDIO_SPEAKER_7POINT1_SURROUND;
+                       rn[1] = KSAUDIO_SPEAKER_7POINT1;
+                       rn[2] = 0;
+               } else if (sd->channels == 6) {
+                       rn[0] = KSAUDIO_SPEAKER_5POINT1_SURROUND;
+                       rn[1] = KSAUDIO_SPEAKER_5POINT1;
                        rn[2] = 0;
                } else if (sd->channels == 4) {
-                       rn[0] = KSAUDIO_SPEAKER_QUAD;
-                       rn[1] = KSAUDIO_SPEAKER_QUAD_SURROUND;
+                       rn[0] = KSAUDIO_SPEAKER_QUAD_SURROUND;
+                       rn[1] = KSAUDIO_SPEAKER_QUAD;
                        rn[2] = KSAUDIO_SPEAKER_SURROUND;
                        rn[3] = 0;
                } else if (sd->channels == 2) {
@@ -1946,24 +1951,24 @@ static int open_sound (void)
        size &= ~63;
 
        sdp->softvolume = -1;
-       num = enumerate_sound_devices ();
+       num = enumerate_sound_devices();
        if (currprefs.win32_soundcard >= num)
                currprefs.win32_soundcard = changed_prefs.win32_soundcard = 0;
        if (num == 0)
                return 0;
-       ch = get_audio_nativechannels (currprefs.sound_stereo);
+       ch = get_audio_nativechannels(active_sound_stereo);
        ret = open_sound_device (sdp, currprefs.win32_soundcard, size, currprefs.sound_freq, ch);
        if (!ret)
                return 0;
        currprefs.sound_freq = changed_prefs.sound_freq = sdp->freq;
        if (ch != sdp->channels)
-               currprefs.sound_stereo = changed_prefs.sound_stereo = get_audio_stereomode (sdp->channels);
+               active_sound_stereo = get_audio_stereomode (sdp->channels);
 
        set_volume (currprefs.sound_volume_master, sdp->mute);
-       if (get_audio_amigachannels (currprefs.sound_stereo) == 4)
+       if (get_audio_amigachannels(active_sound_stereo) == 4)
                sample_handler = sample16ss_handler;
        else
-               sample_handler = get_audio_ismono (currprefs.sound_stereo) ? sample16_handler : sample16s_handler;
+               sample_handler = get_audio_ismono(active_sound_stereo) ? sample16_handler : sample16s_handler;
 
        sdp->obtainedfreq = currprefs.sound_freq;
 
@@ -2783,9 +2788,9 @@ void finish_sound_buffer (void)
                return;
        }
        if (currprefs.sound_stereo_swap_paula) {
-               if (get_audio_nativechannels (currprefs.sound_stereo) == 2 || get_audio_nativechannels (currprefs.sound_stereo) == 4)
+               if (get_audio_nativechannels(active_sound_stereo) == 2 || get_audio_nativechannels(active_sound_stereo) == 4)
                        channelswap((uae_s16*)paula_sndbuffer, bufsize / 2);
-               else if (get_audio_nativechannels (currprefs.sound_stereo) == 6)
+               else if (get_audio_nativechannels(active_sound_stereo) >= 6)
                        channelswap6((uae_s16*)paula_sndbuffer, bufsize / 2);
        }
 #ifdef DRIVESOUND
index 8ea3c36f45400472fd36f3fd7c4627648cceeac9..384f6f0a1176b1b8b5c3412eb56b8a474ce36bf3 100644 (file)
@@ -63,70 +63,7 @@ void set_volume_sound_device (struct sound_data *sd, int volume, int mute);
 extern int outputsample, doublesample;
 #endif
 
-static uae_u16 *paula_sndbufpt_prev, *paula_sndbufpt_start;
-
-STATIC_INLINE void set_sound_buffers (void)
-{
-#if SOUNDSTUFF > 1
-       paula_sndbufpt_prev = paula_sndbufpt_start;
-       paula_sndbufpt_start = paula_sndbufpt;
-#endif
-}
-
-STATIC_INLINE void check_sound_buffers (void)
-{
-#if SOUNDSTUFF > 1
-       int len;
-#endif
-
-       if (currprefs.sound_stereo == SND_4CH_CLONEDSTEREO) {
-               ((uae_u16*)paula_sndbufpt)[0] = ((uae_u16*)paula_sndbufpt)[-2];
-               ((uae_u16*)paula_sndbufpt)[1] = ((uae_u16*)paula_sndbufpt)[-1];
-               paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2 * 2);
-       } else if (currprefs.sound_stereo == SND_6CH_CLONEDSTEREO) {
-               uae_s16 *p = ((uae_s16*)paula_sndbufpt);
-               uae_s32 sum;
-               p[2] = p[-2];
-               p[3] = p[-1];
-               sum = (uae_s32)(p[-2]) + (uae_s32)(p[-1]) + (uae_s32)(p[2]) + (uae_s32)(p[3]);
-               p[0] = sum / 8;
-               p[1] = sum / 8;
-               paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 4 * 2);
-       }
-#if SOUNDSTUFF > 1
-       if (outputsample == 0)
-               return;
-       len = paula_sndbufpt - paula_sndbufpt_start;
-       if (outputsample < 0) {
-               int i;
-               uae_s16 *p1 = (uae_s16*)paula_sndbufpt_prev;
-               uae_s16 *p2 = (uae_s16*)paula_sndbufpt_start;
-               for (i = 0; i < len; i++) {
-                       *p1 = (*p1 + *p2) / 2;
-               }
-               paula_sndbufpt = paula_sndbufpt_start;
-       }
-#endif
-       if ((uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer >= paula_sndbufsize) {
-               finish_sound_buffer ();
-       }
-#if SOUNDSTUFF > 1
-       while (doublesample-- > 0) {
-               memcpy (paula_sndbufpt, paula_sndbufpt_start, len * 2);
-               paula_sndbufpt += len;
-               if ((uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer >= paula_sndbufsize) {
-                       finish_sound_buffer ();
-                       paula_sndbufpt = paula_sndbuffer;
-               }
-       }
-#endif
-}
-
-STATIC_INLINE void clear_sound_buffers (void)
-{
-       memset (paula_sndbuffer, 0, paula_sndbufsize);
-       paula_sndbufpt = paula_sndbuffer;
-}
+extern int active_sound_stereo;
 
 #define PUT_SOUND_WORD(b) do { *(uae_u16 *)paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2); } while (0)
 #define PUT_SOUND_WORD_MONO(b) PUT_SOUND_WORD(b)
index f3e3610de82dc4a1745805e1e9255ecb7b53abec..ed41aea0598fdaa335bb2d8df5aa7cfa3f4c1243 100644 (file)
@@ -14008,9 +14008,11 @@ static void values_to_sounddlg (HWND hDlg)
        xSendDlgItemMessage (hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)txt);
        WIN32GUI_LoadUIString (IDS_SOUND_CLONED51, txt, sizeof (txt) / sizeof (TCHAR));
        xSendDlgItemMessage (hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)txt);
-       WIN32GUI_LoadUIString (IDS_SOUND_51, txt, sizeof (txt) / sizeof (TCHAR));
-       xSendDlgItemMessage (hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)txt);
-       xSendDlgItemMessage (hDlg, IDC_SOUNDSTEREO, CB_SETCURSEL, workprefs.sound_stereo, 0);
+       WIN32GUI_LoadUIString(IDS_SOUND_51, txt, sizeof(txt) / sizeof(TCHAR));
+       xSendDlgItemMessage(hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)txt);
+       xSendDlgItemMessage(hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)_T("Cloned stereo (7.1)"));
+       xSendDlgItemMessage(hDlg, IDC_SOUNDSTEREO, CB_ADDSTRING, 0, (LPARAM)_T("7.1 channels"));
+       xSendDlgItemMessage(hDlg, IDC_SOUNDSTEREO, CB_SETCURSEL, workprefs.sound_stereo, 0);
 
        xSendDlgItemMessage (hDlg, IDC_SOUNDSWAP, CB_RESETCONTENT, 0, 0);
        xSendDlgItemMessage (hDlg, IDC_SOUNDSWAP, CB_ADDSTRING, 0, (LPARAM)_T("-"));