kopia lustrzana https://github.com/OpenRTX/OpenRTX
Audio stream: fixed early start of input stream when in liner buffer mode
rodzic
15a544e2ad
commit
23b16053df
|
|
@ -61,6 +61,27 @@ static bool validateStream(const streamId id)
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* \internal
|
||||
* Start an audio stream. In case of failure, the stream is freed.
|
||||
*
|
||||
* @param id: stream ID.
|
||||
* @return zero if the stream started, a negative error code otherwise.
|
||||
*/
|
||||
static int startStream(const streamId id)
|
||||
{
|
||||
const struct audioDevice *dev = streams[id].dev;
|
||||
|
||||
int ret = dev->driver->start(dev->instance, dev->config, &streams[id].ctx);
|
||||
if(ret < 0)
|
||||
{
|
||||
streams[id].ctx.running = 0;
|
||||
streams[id].path = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
streamId audioStream_start(const pathId path, stream_sample_t * const buf,
|
||||
const size_t length, const uint32_t sampleRate,
|
||||
const uint8_t mode)
|
||||
|
|
@ -76,9 +97,11 @@ streamId audioStream_start(const pathId path, stream_sample_t * const buf,
|
|||
// Search for an audio device serving the correct output endpoint.
|
||||
const struct audioDevice *dev = NULL;
|
||||
const struct audioDevice *devs = inputDevices;
|
||||
const uint8_t streamMode = (mode & 0xF0);
|
||||
const uint8_t bufMode = (mode & 0x0F);
|
||||
uint8_t endpoint = pathInfo.source;
|
||||
|
||||
if((mode & 0xF0) == STREAM_OUTPUT)
|
||||
if(streamMode == STREAM_OUTPUT)
|
||||
{
|
||||
devs = outputDevices;
|
||||
endpoint = pathInfo.sink;
|
||||
|
|
@ -121,16 +144,16 @@ streamId audioStream_start(const pathId path, stream_sample_t * const buf,
|
|||
streams[id].path = path;
|
||||
streams[id].dev = dev;
|
||||
streams[id].ctx.buffer = buf;
|
||||
streams[id].ctx.bufMode = (mode & 0x0F);
|
||||
streams[id].ctx.bufMode = bufMode;
|
||||
streams[id].ctx.bufSize = length;
|
||||
streams[id].ctx.sampleRate = sampleRate;
|
||||
|
||||
int ret = dev->driver->start(dev->instance, dev->config, &streams[id].ctx);
|
||||
if(ret < 0)
|
||||
// In circular mode, start immediately
|
||||
if(bufMode == BUF_CIRC_DOUBLE)
|
||||
{
|
||||
streams[id].ctx.running = 0;
|
||||
streams[id].path = 0;
|
||||
return ret;
|
||||
int ret = startStream(id);
|
||||
if(ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return id;
|
||||
|
|
@ -163,18 +186,29 @@ void audioStream_terminate(const streamId id)
|
|||
|
||||
dataBlock_t inputStream_getData(streamId id)
|
||||
{
|
||||
dataBlock_t block;
|
||||
block.data = NULL;
|
||||
block.len = 0;
|
||||
const struct audioDevice *dev = streams[id].dev;
|
||||
dataBlock_t block = {NULL, 0};
|
||||
int ret;
|
||||
|
||||
if(validateStream(id) == false)
|
||||
return block;
|
||||
|
||||
int ret = streams[id].dev->driver->sync(&(streams[id].ctx), false);
|
||||
if(streams[id].ctx.bufMode == BUF_LINEAR)
|
||||
{
|
||||
ret = startStream(id);
|
||||
if(ret < 0)
|
||||
{
|
||||
streams[id].ctx.running = 0;
|
||||
streams[id].path = 0;
|
||||
return block;
|
||||
}
|
||||
}
|
||||
|
||||
ret = dev->driver->sync(&(streams[id].ctx), false);
|
||||
if(ret < 0)
|
||||
return block;
|
||||
|
||||
ret = streams[id].dev->driver->data(&(streams[id].ctx), &block.data);
|
||||
ret = dev->driver->data(&(streams[id].ctx), &block.data);
|
||||
if(ret < 0)
|
||||
{
|
||||
block.data = NULL;
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue