162306a36Sopenharmony_ci=======================================
262306a36Sopenharmony_ciSoftware Interface ALSA-DSP MADI Driver 
362306a36Sopenharmony_ci=======================================
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci(translated from German, so no good English ;-), 
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci2004 - winfried ritsch
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciFull functionality has been added to the driver. Since some of
1162306a36Sopenharmony_cithe Controls and startup-options  are ALSA-Standard and only the
1262306a36Sopenharmony_cispecial Controls are described and discussed below.
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciHardware functionality
1662306a36Sopenharmony_ci======================
1762306a36Sopenharmony_ci   
1862306a36Sopenharmony_ciAudio transmission
1962306a36Sopenharmony_ci------------------
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci* number of channels --  depends on transmission mode
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci		The number of channels chosen is from 1..Nmax. The reason to
2462306a36Sopenharmony_ci		use for a lower number of channels is only resource allocation,
2562306a36Sopenharmony_ci		since unused DMA channels are disabled and less memory is
2662306a36Sopenharmony_ci		allocated. So also the throughput of the PCI system can be
2762306a36Sopenharmony_ci		scaled. (Only important for low performance boards).
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci* Single Speed -- 1..64 channels 
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci.. note::
3262306a36Sopenharmony_ci		 (Note: Choosing the 56channel mode for transmission or as
3362306a36Sopenharmony_ci		 receiver, only 56 are transmitted/received over the MADI, but
3462306a36Sopenharmony_ci		 all 64 channels are available for the mixer, so channel count
3562306a36Sopenharmony_ci		 for the driver)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci* Double Speed -- 1..32 channels
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci.. note::
4062306a36Sopenharmony_ci		 Note: Choosing the 56-channel mode for
4162306a36Sopenharmony_ci		 transmission/receive-mode , only 28 are transmitted/received
4262306a36Sopenharmony_ci		 over the MADI, but all 32 channels are available for the mixer,
4362306a36Sopenharmony_ci		 so channel count for the driver
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci* Quad Speed -- 1..16 channels 
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci.. note::
4962306a36Sopenharmony_ci		 Choosing the 56-channel mode for
5062306a36Sopenharmony_ci		 transmission/receive-mode , only 14 are transmitted/received
5162306a36Sopenharmony_ci		 over the MADI, but all 16 channels are available for the mixer,
5262306a36Sopenharmony_ci		 so channel count for the driver
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci* Format -- signed 32 Bit Little Endian (SNDRV_PCM_FMTBIT_S32_LE)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci* Sample Rates --
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci       Single Speed -- 32000, 44100, 48000
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci       Double Speed -- 64000, 88200, 96000 (untested)
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci       Quad Speed -- 128000, 176400, 192000 (untested)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci* access-mode -- MMAP (memory mapped), Not interleaved (PCM_NON-INTERLEAVED)
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci* buffer-sizes -- 64,128,256,512,1024,2048,8192 Samples
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci* fragments -- 2
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci* Hardware-pointer -- 2 Modi
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci		 The Card supports the readout of the actual Buffer-pointer,
7462306a36Sopenharmony_ci		 where DMA reads/writes. Since of the bulk mode of PCI it is only
7562306a36Sopenharmony_ci		 64 Byte accurate. SO it is not really usable for the
7662306a36Sopenharmony_ci		 ALSA-mid-level functions (here the buffer-ID gives a better
7762306a36Sopenharmony_ci		 result), but if MMAP is used by the application. Therefore it
7862306a36Sopenharmony_ci		 can be configured at load-time with the parameter
7962306a36Sopenharmony_ci		 precise-pointer.
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci.. hint::
8362306a36Sopenharmony_ci		 (Hint: Experimenting I found that the pointer is maximum 64 to
8462306a36Sopenharmony_ci		 large never to small. So if you subtract 64 you always have a
8562306a36Sopenharmony_ci		 safe pointer for writing, which is used on this mode inside
8662306a36Sopenharmony_ci		 ALSA. In theory now you can get now a latency as low as 16
8762306a36Sopenharmony_ci		 Samples, which is a quarter of the interrupt possibilities.)
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci   * Precise Pointer -- off
9062306a36Sopenharmony_ci					interrupt used for pointer-calculation
9162306a36Sopenharmony_ci				
9262306a36Sopenharmony_ci   * Precise Pointer -- on
9362306a36Sopenharmony_ci					hardware pointer used.
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ciController
9662306a36Sopenharmony_ci----------
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciSince DSP-MADI-Mixer has 8152 Fader, it does not make sense to
9962306a36Sopenharmony_ciuse the standard mixer-controls, since this would break most of
10062306a36Sopenharmony_ci(especially graphic) ALSA-Mixer GUIs. So Mixer control has be
10162306a36Sopenharmony_ciprovided by a 2-dimensional controller using the
10262306a36Sopenharmony_cihwdep-interface. 
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciAlso all 128+256 Peak and RMS-Meter can be accessed via the
10562306a36Sopenharmony_cihwdep-interface. Since it could be a performance problem always
10662306a36Sopenharmony_cicopying and converting Peak and RMS-Levels even if you just need
10762306a36Sopenharmony_cione, I decided to export the hardware structure, so that of
10862306a36Sopenharmony_cineeded some driver-guru can implement a memory-mapping of mixer
10962306a36Sopenharmony_cior peak-meters over ioctl, or also to do only copying and no
11062306a36Sopenharmony_ciconversion. A test-application shows the usage of the controller.
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci* Latency Controls --- not implemented !!!
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci.. note::
11562306a36Sopenharmony_ci	   Note: Within the windows-driver the latency is accessible of a
11662306a36Sopenharmony_ci	   control-panel, but buffer-sizes are controlled with ALSA from
11762306a36Sopenharmony_ci	   hwparams-calls and should not be changed in run-state, I did not
11862306a36Sopenharmony_ci	   implement it here.
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci* System Clock -- suspended !!!!
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci  * Name -- "System Clock Mode"
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci  * Access -- Read Write
12662306a36Sopenharmony_ci    
12762306a36Sopenharmony_ci  * Values -- "Master" "Slave"
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci.. note::
13062306a36Sopenharmony_ci		  !!!! This is a hardware-function but is in conflict with the
13162306a36Sopenharmony_ci		  Clock-source controller, which is a kind of ALSA-standard. I
13262306a36Sopenharmony_ci		  makes sense to set the card to a special mode (master at some
13362306a36Sopenharmony_ci		  frequency or slave), since even not using an Audio-application
13462306a36Sopenharmony_ci		  a studio should have working synchronisations setup. So use
13562306a36Sopenharmony_ci		  Clock-source-controller instead !!!!
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci* Clock Source  
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci  * Name -- "Sample Clock Source"
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci  * Access -- Read Write
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci  * Values -- "AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz",
14462306a36Sopenharmony_ci    "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz",
14562306a36Sopenharmony_ci    "Internal 96.0 kHz"
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci		 Choose between Master at a specific Frequency and so also the
14862306a36Sopenharmony_ci		 Speed-mode or Slave (Autosync). Also see  "Preferred Sync Ref"
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci.. warning::
15162306a36Sopenharmony_ci       !!!! This is no pure hardware function but was implemented by
15262306a36Sopenharmony_ci       ALSA by some ALSA-drivers before, so I use it also. !!!
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci* Preferred Sync Ref
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci  * Name -- "Preferred Sync Reference"
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci  * Access -- Read Write
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci  * Values -- "Word" "MADI"
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci		 Within the Auto-sync-Mode the preferred Sync Source can be
16562306a36Sopenharmony_ci		 chosen. If it is not available another is used if possible.
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci.. note::
16862306a36Sopenharmony_ci		 Note: Since MADI has a much higher bit-rate than word-clock, the
16962306a36Sopenharmony_ci		 card should synchronise better in MADI Mode. But since the
17062306a36Sopenharmony_ci		 RME-PLL is very good, there are almost no problems with
17162306a36Sopenharmony_ci		 word-clock too. I never found a difference.
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci* TX 64 channel
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci  * Name -- "TX 64 channels mode"
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci  * Access -- Read Write
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci  * Values -- 0 1
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci		 Using 64-channel-modus (1) or 56-channel-modus for
18362306a36Sopenharmony_ci		 MADI-transmission (0).
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci.. note::
18762306a36Sopenharmony_ci		 Note: This control is for output only. Input-mode is detected
18862306a36Sopenharmony_ci		 automatically from hardware sending MADI.
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci* Clear TMS
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci  * Name -- "Clear Track Marker"
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci  * Access -- Read Write
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci  * Values -- 0 1
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci		 Don't use to lower 5 Audio-bits on AES as additional Bits.
20162306a36Sopenharmony_ci        
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci* Safe Mode oder Auto Input
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci  * Name -- "Safe Mode"
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci  * Access -- Read Write
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci  * Values -- 0 1 (default on)
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci		 If on (1), then if either the optical or coaxial connection
21262306a36Sopenharmony_ci		 has a failure, there is a takeover to the working one, with no
21362306a36Sopenharmony_ci		 sample failure. Its only useful if you use the second as a
21462306a36Sopenharmony_ci		 backup connection.
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci* Input
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci  * Name -- "Input Select"
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci  * Access -- Read Write
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci  * Values -- optical coaxial
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci		 Choosing the Input, optical or coaxial. If Safe-mode is active,
22662306a36Sopenharmony_ci		 this is the preferred Input.
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ciMixer
22962306a36Sopenharmony_ci-----
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci* Mixer
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci  * Name -- "Mixer"
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci  * Access -- Read Write
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci  * Values - <channel-number 0-127> <Value 0-65535>
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci		 Here as a first value the channel-index is taken to get/set the
24162306a36Sopenharmony_ci		 corresponding mixer channel, where 0-63 are the input to output
24262306a36Sopenharmony_ci		 fader and 64-127 the playback to outputs fader. Value 0
24362306a36Sopenharmony_ci		 is channel muted 0 and 32768 an amplification of  1.
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci* Chn 1-64
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci       fast mixer for the ALSA-mixer utils. The diagonal of the
24862306a36Sopenharmony_ci       mixer-matrix is implemented from playback to output.
24962306a36Sopenharmony_ci       
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci* Line Out
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci  * Name  -- "Line Out"
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci  * Access -- Read Write
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci  * Values -- 0 1
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci		 Switching on and off the analog out, which has nothing to do
26062306a36Sopenharmony_ci		 with mixing or routing. the analog outs reflects channel 63,64.
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ciInformation (only read access)
26462306a36Sopenharmony_ci------------------------------
26562306a36Sopenharmony_ci 
26662306a36Sopenharmony_ci* Sample Rate
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci  * Name -- "System Sample Rate"
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci  * Access -- Read-only
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci		 getting the sample rate.
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci* External Rate measured
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci  * Name -- "External Rate"
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci  * Access -- Read only
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci		 Should be "Autosync Rate", but Name used is
28362306a36Sopenharmony_ci		 ALSA-Scheme. External Sample frequency liked used on Autosync is
28462306a36Sopenharmony_ci		 reported.
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci* MADI Sync Status
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci  * Name -- "MADI Sync Lock Status"
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci  * Access -- Read
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci  * Values -- 0,1,2
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci       MADI-Input is 0=Unlocked, 1=Locked, or 2=Synced.
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci* Word Clock Sync Status
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci  * Name -- "Word Clock Lock Status"
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci  * Access -- Read
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci  * Values -- 0,1,2
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci       Word Clock Input is 0=Unlocked, 1=Locked, or 2=Synced.
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci* AutoSync
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci  * Name -- "AutoSync Reference"
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci  * Access -- Read
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci  * Values -- "WordClock", "MADI", "None"
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci		 Sync-Reference is either "WordClock", "MADI" or none.
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci* RX 64ch --- noch nicht implementiert
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci       MADI-Receiver is in 64 channel mode oder 56 channel mode.
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci* AB_inp   --- not tested 
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci		 Used input for Auto-Input.
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci* actual Buffer Position --- not implemented
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	   !!! this is a ALSA internal function, so no control is used !!!
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ciCalling Parameter
33562306a36Sopenharmony_ci=================
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci* index int array (min = 1, max = 8) 
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci     Index value for RME HDSPM interface. card-index within ALSA
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci     note: ALSA-standard
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci* id string array (min = 1, max = 8) 
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci     ID string for RME HDSPM interface.
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci     note: ALSA-standard
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci* enable int array (min = 1, max = 8)
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci     Enable/disable specific HDSPM sound-cards.
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci     note: ALSA-standard
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci* precise_ptr int array (min = 1, max = 8)
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci     Enable precise pointer, or disable.
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci.. note::
36062306a36Sopenharmony_ci     note: Use only when the application supports this (which is a special case).
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci* line_outs_monitor int array (min = 1, max = 8)
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci     Send playback streams to analog outs by default.
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci.. note::
36762306a36Sopenharmony_ci	  note: each playback channel is mixed to the same numbered output
36862306a36Sopenharmony_ci	  channel (routed). This is against the ALSA-convention, where all
36962306a36Sopenharmony_ci	  channels have to be muted on after loading the driver, but was
37062306a36Sopenharmony_ci	  used before on other cards, so i historically use it again)
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci* enable_monitor int array (min = 1, max = 8)
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci     Enable Analog Out on Channel 63/64 by default.
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci.. note ::
37962306a36Sopenharmony_ci      note: here the analog output is enabled (but not routed).
380