diff src/audio/mint/SDL_mintaudio.c @ 961:185acc07127a

Date: Fri, 29 Oct 2004 11:47:09 +0200 From: Patrice Mandin Subject: Reworked audio drivers for Atari platform These are reworked audio drivers for the Atari platform. Previous drivers were missing some features: - Test external clock plugged to DSP port on Atari Falcon 030. - Ability to select internal or external clock. So now, I generate a list of frequencies available, with the master clock and predivisor to use. One big caveat to this: I do not have an external clock, so I hope it works.
author Patrice Mandin <patmandin@gmail.com>
date Fri, 29 Oct 2004 09:56:53 +0000
parents b8d311d90021
children 2eca15c3f609
line wrap: on
line diff
--- a/src/audio/mint/SDL_mintaudio.c	Sat Oct 09 22:11:45 2004 +0000
+++ b/src/audio/mint/SDL_mintaudio.c	Fri Oct 29 09:56:53 2004 +0000
@@ -41,6 +41,7 @@
 unsigned long SDL_MintAudio_audiosize;		/* Length of audio buffer=spec->size */
 unsigned short SDL_MintAudio_numbuf;		/* Buffer to play */
 unsigned short SDL_MintAudio_mutex;
+unsigned long SDL_MintAudio_clocktics;
 cookie_stfa_t	*SDL_MintAudio_stfa;
 
 /* The callback function, called by each driver whenever needed */
@@ -64,30 +65,57 @@
 	}
 }
 
-/* Simple function to search for the nearest frequency */
-int SDL_MintAudio_SearchFrequency(_THIS, int falcon_codec, int desired_freq)
+/* Add a new frequency/clock/predivisor to the current list */
+void SDL_MintAudio_AddFrequency(_THIS, Uint32 frequency, Uint32 clock, Uint32 prediv)
+{
+	int i, p;
+
+	if (MINTAUDIO_freqcount==MINTAUDIO_maxfreqs) {
+		return;
+	}
+
+	/* Search where to insert the frequency (highest first) */
+	for (p=0; p<MINTAUDIO_freqcount; p++) {
+		if (frequency > MINTAUDIO_frequencies[p].frequency) {
+			break;
+		}
+	}
+
+	/* Put all following ones farer */
+	if (MINTAUDIO_freqcount>0) {
+		for (i=MINTAUDIO_freqcount; i>p; i--) {
+			MINTAUDIO_frequencies[i].frequency = MINTAUDIO_frequencies[i-1].frequency;
+			MINTAUDIO_frequencies[i].masterclock = MINTAUDIO_frequencies[i-1].masterclock;
+			MINTAUDIO_frequencies[i].predivisor = MINTAUDIO_frequencies[i-1].predivisor;
+		}
+	}
+
+	/* And insert new one */
+	MINTAUDIO_frequencies[p].frequency = frequency;
+	MINTAUDIO_frequencies[p].masterclock = clock;
+	MINTAUDIO_frequencies[p].predivisor = prediv;
+
+	MINTAUDIO_freqcount++;
+}
+
+/* Search for the nearest frequency */
+int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq)
 {
 	int i;
 
 	/* Only 1 freq ? */
-	if (MINTAUDIO_nfreq==1) {
-		return(MINTAUDIO_sfreq);
+	if (MINTAUDIO_freqcount==1) {
+		return 0;
 	}
 
 	/* Check the array */
-	for (i=MINTAUDIO_sfreq; i<MINTAUDIO_nfreq-1; i++) {
-		/* Remove unusable falcon codec frequencies */
-		if (falcon_codec) {
-			if ((i==6) || (i==8) || (i==10)) {
-				continue;
-			}
-		}
-
-		if (desired_freq >= ((MINTAUDIO_hardfreq[i]+MINTAUDIO_hardfreq[i+1])>>1)) {
+	for (i=0; i<MINTAUDIO_freqcount; i++) {
+		if (desired_freq >= ((MINTAUDIO_frequencies[i].frequency+
+			MINTAUDIO_frequencies[i+1].frequency)>>1)) {
 			return i;
 		}
 	}
 
 	/* Not in the array, give the latest */
-	return MINTAUDIO_nfreq-1;
+	return MINTAUDIO_freqcount-1;
 }