81 lines
1.7 KiB
C
81 lines
1.7 KiB
C
|
/*
|
||
|
* oxfw_stream.c - a part of driver for OXFW970/971 based devices
|
||
|
*
|
||
|
* Copyright (c) 2014 Takashi Sakamoto
|
||
|
*
|
||
|
* Licensed under the terms of the GNU General Public License, version 2.
|
||
|
*/
|
||
|
|
||
|
#include "oxfw.h"
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
static void stop_stream(struct snd_oxfw *oxfw)
|
||
|
{
|
||
|
amdtp_stream_pcm_abort(&oxfw->rx_stream);
|
||
|
amdtp_stream_stop(&oxfw->rx_stream);
|
||
|
cmp_connection_break(&oxfw->in_conn);
|
||
|
}
|
||
|
|
||
|
int snd_oxfw_stream_start_simplex(struct snd_oxfw *oxfw)
|
||
|
{
|
||
|
int err = 0;
|
||
|
|
||
|
if (amdtp_streaming_error(&oxfw->rx_stream))
|
||
|
stop_stream(oxfw);
|
||
|
|
||
|
if (amdtp_stream_running(&oxfw->rx_stream))
|
||
|
goto end;
|
||
|
|
||
|
err = cmp_connection_establish(&oxfw->in_conn,
|
||
|
amdtp_stream_get_max_payload(&oxfw->rx_stream));
|
||
|
if (err < 0)
|
||
|
goto end;
|
||
|
|
||
|
err = amdtp_stream_start(&oxfw->rx_stream,
|
||
|
oxfw->in_conn.resources.channel,
|
||
|
oxfw->in_conn.speed);
|
||
|
if (err < 0)
|
||
|
stop_stream(oxfw);
|
||
|
end:
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
void snd_oxfw_stream_stop_simplex(struct snd_oxfw *oxfw)
|
||
|
{
|
||
|
stop_stream(oxfw);
|
||
|
}
|
||
|
|
||
|
void snd_oxfw_stream_destroy_simplex(struct snd_oxfw *oxfw)
|
||
|
{
|
||
|
stop_stream(oxfw);
|
||
|
|
||
|
amdtp_stream_destroy(&oxfw->rx_stream);
|
||
|
cmp_connection_destroy(&oxfw->in_conn);
|
||
|
}
|
||
|
|
||
|
void snd_oxfw_stream_update_simplex(struct snd_oxfw *oxfw)
|
||
|
{
|
||
|
if (cmp_connection_update(&oxfw->in_conn) < 0)
|
||
|
stop_stream(oxfw);
|
||
|
else
|
||
|
amdtp_stream_update(&oxfw->rx_stream);
|
||
|
}
|