}
}
+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;
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 ();
}
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);
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) {
+ 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);
}
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;
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 };
SND_4CH,
SND_6CH_CLONEDSTEREO,
SND_6CH,
+ SND_8CH_CLONEDSTEREO,
+ SND_8CH,
SND_NONE
};
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];
}
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;
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) {
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;
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
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)
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("-"));