static int init_stream(struct snd_efw *efw, struct amdtp_stream *stream) { struct cmp_connection *conn; enum cmp_direction c_dir; enum amdtp_stream_direction s_dir; int err; if (stream == &efw->tx_stream) { conn = &efw->out_conn; c_dir = CMP_OUTPUT; s_dir = AMDTP_IN_STREAM; } else { conn = &efw->in_conn; c_dir = CMP_INPUT; s_dir = AMDTP_OUT_STREAM; } err = cmp_connection_init(conn, efw->unit, c_dir, 0); if (err < 0) goto end; err = amdtp_stream_init(stream, efw->unit, s_dir, CIP_BLOCKING); if (err < 0) { amdtp_stream_destroy(stream); cmp_connection_destroy(conn); } end: return err; }
int snd_bebob_stream_init(struct snd_bebob *bebob, struct amdtp_stream *stream) { struct cmp_connection *conn; enum cmp_direction c_dir; enum amdtp_stream_direction s_dir; int err; if (stream == &bebob->tx_stream) { conn= &bebob->out_conn; c_dir = CMP_OUTPUT; s_dir = AMDTP_IN_STREAM; } else { conn= &bebob->in_conn; c_dir = CMP_INPUT; s_dir = AMDTP_OUT_STREAM; } err = cmp_connection_init(conn, bebob->unit, c_dir, 0); if (err < 0) goto end; err = amdtp_stream_init(stream, bebob->unit, s_dir, CIP_NONBLOCKING); if (err < 0) { cmp_connection_destroy(conn); goto end; } end: return err; }
int amdtp_tscm_init(struct amdtp_stream *s, struct fw_unit *unit, enum amdtp_stream_direction dir, unsigned int pcm_channels) { amdtp_stream_process_data_blocks_t process_data_blocks; struct amdtp_tscm *p; unsigned int fmt; int err; if (dir == AMDTP_IN_STREAM) { fmt = AMDTP_FMT_TSCM_TX; process_data_blocks = process_tx_data_blocks; } else { fmt = AMDTP_FMT_TSCM_RX; process_data_blocks = process_rx_data_blocks; } err = amdtp_stream_init(s, unit, dir, CIP_NONBLOCKING | CIP_SKIP_DBC_ZERO_CHECK, fmt, process_data_blocks, sizeof(struct amdtp_tscm)); if (err < 0) return 0; /* Use fixed value for FDF field. */ s->ctx_data.rx.fdf = 0x00; /* This protocol uses fixed number of data channels for PCM samples. */ p = s->protocol; p->pcm_channels = pcm_channels; return 0; }
/** * amdtp_am824_init - initialize an AMDTP stream structure to handle AM824 * data block * @s: the AMDTP stream to initialize * @unit: the target of the stream * @dir: the direction of stream * @flags: the packet transmission method to use */ int amdtp_am824_init(struct amdtp_stream *s, struct fw_unit *unit, enum amdtp_stream_direction dir, enum cip_flags flags) { amdtp_stream_process_data_blocks_t process_data_blocks; if (dir == AMDTP_IN_STREAM) process_data_blocks = process_tx_data_blocks; else process_data_blocks = process_rx_data_blocks; return amdtp_stream_init(s, unit, dir, flags, CIP_FMT_AM, process_data_blocks, sizeof(struct amdtp_am824)); }
int snd_oxfw_stream_init_simplex(struct snd_oxfw *oxfw) { int err; err = cmp_connection_init(&oxfw->in_conn, oxfw->unit, CMP_INPUT, 0); if (err < 0) goto end; err = amdtp_stream_init(&oxfw->rx_stream, oxfw->unit, AMDTP_OUT_STREAM, CIP_NONBLOCKING); if (err < 0) { amdtp_stream_destroy(&oxfw->rx_stream); cmp_connection_destroy(&oxfw->in_conn); } end: return err; }