2019-05-29 16:57:59 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2014-04-25 22:45:23 +09:00
/*
* bebob_yamaha . c - a part of driver for BeBoB based devices
*
* Copyright ( c ) 2013 - 2014 Takashi Sakamoto
*/
# include "./bebob.h"
/*
* NOTE :
* Yamaha GO44 is not designed to be used as stand - alone mixer . So any streams
* must be accompanied . If changing the state , a LED on the device starts to
* blink and its sync status is false . In this state , the device sounds nothing
* even if streaming . To start streaming at the current sampling rate is only
2016-08-24 21:42:42 +09:00
* way to recover this state . GO46 is better for stand - alone mixer .
2014-04-25 22:45:23 +09:00
*
* Both of them have a capability to change its sampling rate up to 192.0 kHz .
* At 192.0 kHz , the device reports 4 PCM - in , 1 MIDI - in , 6 PCM - out , 1 MIDI - out .
* But Yamaha ' s driver reduce 2 PCM - in , 1 MIDI - in , 2 PCM - out , 1 MIDI - out to use
* ' Extended Stream Format Information Command - Single Request ' in ' Additional
* AVC commands ' defined by BridgeCo .
* This ALSA driver don ' t do this because a bit tiresome . Then isochronous
* streaming with many asynchronous transactions brings sounds with noises .
* Unfortunately current ' ffado - mixer ' generated many asynchronous transaction
* to observe device ' s state , mainly check cmp connection and signal format . I
2016-08-24 21:42:42 +09:00
* recommend users to close ffado - mixer at 192.0 kHz if mixer is needless .
2016-08-24 21:42:43 +09:00
*
* Terratec PHASE 24 FW and PHASE X24 FW are internally the same as
* Yamaha GO 44 and GO 46. Yamaha and Terratec had cooperated for these models .
2014-04-25 22:45:23 +09:00
*/
2017-08-22 22:58:15 +09:00
static const enum snd_bebob_clock_type clk_src_types [ ] = {
2015-06-14 12:49:29 +09:00
SND_BEBOB_CLOCK_TYPE_INTERNAL ,
SND_BEBOB_CLOCK_TYPE_EXTERNAL , /* S/PDIF */
} ;
2014-04-25 22:45:23 +09:00
static int
clk_src_get ( struct snd_bebob * bebob , unsigned int * id )
{
2015-06-14 12:49:29 +09:00
int err ;
err = avc_audio_get_selector ( bebob - > unit , 0 , 4 , id ) ;
if ( err < 0 )
return err ;
if ( * id > = ARRAY_SIZE ( clk_src_types ) )
return - EIO ;
return 0 ;
2014-04-25 22:45:23 +09:00
}
2015-10-11 08:10:55 +02:00
static const struct snd_bebob_clock_spec clock_spec = {
2015-06-14 12:49:29 +09:00
. num = ARRAY_SIZE ( clk_src_types ) ,
. types = clk_src_types ,
2014-04-25 22:45:23 +09:00
. get = & clk_src_get ,
} ;
2015-10-11 08:10:55 +02:00
static const struct snd_bebob_rate_spec rate_spec = {
2014-04-25 22:45:23 +09:00
. get = & snd_bebob_stream_get_rate ,
. set = & snd_bebob_stream_set_rate ,
} ;
2016-08-24 21:42:43 +09:00
const struct snd_bebob_spec yamaha_terratec_spec = {
2014-04-25 22:45:23 +09:00
. clock = & clock_spec ,
. rate = & rate_spec ,
. meter = NULL
} ;