From: Toni Wilen Date: Sat, 16 Sep 2023 16:32:44 +0000 (+0300) Subject: 8 ch audio support. X-Git-Tag: 5.1.0~125 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=ed18f41e4f8858c6242f2bb1c8319accfbfde38b;p=francis%2Fwinuae.git 8 ch audio support. --- diff --git a/audio.cpp b/audio.cpp index 7127f51f..a47cbb63 100644 --- 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; diff --git a/cfgfile.cpp b/cfgfile.cpp index 55d91af9..4896ef3f 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -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 }; diff --git a/include/audio.h b/include/audio.h index eef61d5e..8e835445 100644 --- a/include/audio.h +++ b/include/audio.h @@ -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]; } diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index bc60e319..c1c79d6b 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -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 diff --git a/od-win32/sounddep/sound.h b/od-win32/sounddep/sound.h index 8ea3c36f..384f6f0a 100644 --- a/od-win32/sounddep/sound.h +++ b/od-win32/sounddep/sound.h @@ -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) diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index f3e3610d..ed41aea0 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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("-"));