[alsa-devel] [RME MADI/RayDAT/AIO/AES] Changing hdspm_config and hdspm_status

Adrian Knoth adi at drcomp.erfurt.thur.de
Mon Aug 22 18:31:04 CEST 2011


On 08/22/11 18:28, Adrian Knoth wrote:

> I'll post the changes to hdspm.c in a second, but that's just a
> preview for discussion, not necessarily the final patch.


diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index 493e394..0518cfe 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -918,6 +918,7 @@ struct hdspm {

 	int last_external_sample_rate;	/* samplerate mystic ... */
 	int last_internal_sample_rate;
+	uint32_t dds;
 	int system_sample_rate;

 	int dev;		/* Hardware vars... */
@@ -1355,6 +1356,7 @@ static void hdspm_set_dds_value(struct hdspm
*hdspm, int rate)

 	if (rate >= 112000)
 		rate /= 4;
+	hdspm->dds = (u32) n;
 	else if (rate >= 56000)
 		rate /= 2;

@@ -6093,7 +6095,7 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep
*hw, struct file *file,
 	void __user *argp = (void __user *)arg;
 	struct hdspm *hdspm = hw->private_data;
 	struct hdspm_mixer_ioctl mixer;
-	struct hdspm_config info;
+	struct hdspm_config config;
 	struct hdspm_status status;
 	struct hdspm_version hdspm_version;
 	struct hdspm_peak_rms *levels;
@@ -6199,21 +6201,36 @@ static int snd_hdspm_hwdep_ioctl(struct
snd_hwdep *hw, struct file *file,

 	case SNDRV_HDSPM_IOCTL_GET_CONFIG:

-		memset(&info, 0, sizeof(info));
+		memset(&config, 0, sizeof(config));
 		spin_lock_irq(&hdspm->lock);
-		info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
-		info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
-
-		info.system_sample_rate = hdspm->system_sample_rate;
-		info.autosync_sample_rate =
-			hdspm_external_sample_rate(hdspm);
-		info.system_clock_mode = hdspm_system_clock_mode(hdspm);
-		info.clock_source = hdspm_clock_source(hdspm);
-		info.autosync_ref = hdspm_autosync_ref(hdspm);
-		info.line_out = hdspm_line_out(hdspm);
-		info.passthru = 0;
+		config.dds = hdspm->dds;
+		if (hdspm->system_sample_rate <= 48000) {
+		  config.freq = hdspm->system_sample_rate;
+		  config.wck_mul = 1;
+		} else if (hdspm->system_sample_rate <= 96000) {
+		  config.freq = hdspm->system_sample_rate/2;
+		  config.wck_mul = 2;
+		} else {
+		  config.freq = hdspm->system_sample_rate/4;
+		  config.wck_mul = 4;
+		}
+		config.clock_mode = hdspm_system_clock_mode(hdspm);
+
+		switch (hdspm->io_type) {
+		case MADI:
+		  config.card_specific.madi.line_out = hdspm_line_out(hdspm);
+		  config.card_specific.madi.tms = hdspm_c_tms(hdspm);
+		  config.card_specific.madi.input_select = hdspm_input_select(hdspm);
+		  config.card_specific.madi.output_mode = hdspm_tx_64(hdspm);
+		  config.card_specific.madi.sync_ref = hdspm_pref_sync_ref(hdspm);
+		  break;
+
+		default:
+		  break;
+		}
+
 		spin_unlock_irq(&hdspm->lock);
-		if (copy_to_user((void __user *) arg, &info, sizeof(info)))
+		if (copy_to_user((void __user *) arg, &config, sizeof(config)))
 			return -EFAULT;
 		break;

@@ -6239,10 +6256,8 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep
*hw, struct file *file,

 			statusregister =
 				hdspm_read(hdspm, HDSPM_statusRegister);
-			status.card_specific.madi.madi_input =
-				(statusregister & HDSPM_AB_int) ? 1 : 0;
 			status.card_specific.madi.channel_format =
-				(statusregister & HDSPM_TX_64ch) ? 1 : 0;
+				(statusregister & HDSPM_RX_64ch) ? 1 : 0;
 			/* TODO: Mac driver sets it when f_s>48kHz */
 			status.card_specific.madi.frame_format = 0;



More information about the Alsa-devel mailing list