mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
Fixed mmaped access..
This commit is contained in:
parent
8abf9370b5
commit
8328751e64
5 changed files with 15 additions and 39 deletions
|
|
@ -60,8 +60,9 @@ typedef struct snd_stru_pcm_plugin snd_pcm_plugin_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
INIT = 0,
|
INIT = 0,
|
||||||
DRAIN = 1,
|
PREPARE = 1,
|
||||||
FLUSH = 2
|
DRAIN = 2,
|
||||||
|
FLUSH = 3
|
||||||
} snd_pcm_plugin_action_t;
|
} snd_pcm_plugin_action_t;
|
||||||
|
|
||||||
#define snd_pcm_plugin_extra_data(plugin) (((char *)plugin) + sizeof(*plugin))
|
#define snd_pcm_plugin_extra_data(plugin) (((char *)plugin) + sizeof(*plugin))
|
||||||
|
|
@ -95,6 +96,7 @@ int snd_pcm_plugin_info(snd_pcm_t *handle, snd_pcm_channel_info_t *info);
|
||||||
int snd_pcm_plugin_params(snd_pcm_t *handle, snd_pcm_channel_params_t *params);
|
int snd_pcm_plugin_params(snd_pcm_t *handle, snd_pcm_channel_params_t *params);
|
||||||
int snd_pcm_plugin_setup(snd_pcm_t *handle, snd_pcm_channel_setup_t *setup);
|
int snd_pcm_plugin_setup(snd_pcm_t *handle, snd_pcm_channel_setup_t *setup);
|
||||||
int snd_pcm_plugin_status(snd_pcm_t *handle, snd_pcm_channel_status_t *status);
|
int snd_pcm_plugin_status(snd_pcm_t *handle, snd_pcm_channel_status_t *status);
|
||||||
|
int snd_pcm_plugin_prepare(snd_pcm_t *handle, int channel);
|
||||||
int snd_pcm_plugin_drain_playback(snd_pcm_t *handle);
|
int snd_pcm_plugin_drain_playback(snd_pcm_t *handle);
|
||||||
int snd_pcm_plugin_flush(snd_pcm_t *handle, int channel);
|
int snd_pcm_plugin_flush(snd_pcm_t *handle, int channel);
|
||||||
int snd_pcm_plugin_pointer(snd_pcm_t *pcm, int channel, void **ptr, size_t *size);
|
int snd_pcm_plugin_pointer(snd_pcm_t *pcm, int channel, void **ptr, size_t *size);
|
||||||
|
|
|
||||||
|
|
@ -504,6 +504,15 @@ int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_channel_status_t *status)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int snd_pcm_plugin_prepare(snd_pcm_t *pcm, int channel)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if ((err = snd_pcm_plugin_action(pcm, channel, PREPARE))<0)
|
||||||
|
return err;
|
||||||
|
return snd_pcm_channel_prepare(pcm, channel);
|
||||||
|
}
|
||||||
|
|
||||||
int snd_pcm_plugin_drain_playback(snd_pcm_t *pcm)
|
int snd_pcm_plugin_drain_playback(snd_pcm_t *pcm)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
|
||||||
|
|
@ -55,21 +55,6 @@ static ssize_t block_transfer(snd_pcm_plugin_t *plugin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int block_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action)
|
|
||||||
{
|
|
||||||
struct block_private_data *data;
|
|
||||||
|
|
||||||
if (plugin == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
data = (struct block_private_data *)snd_pcm_plugin_extra_data(plugin);
|
|
||||||
if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) {
|
|
||||||
return snd_pcm_drain_playback(data->pcm);
|
|
||||||
} else if (action == FLUSH) {
|
|
||||||
return snd_pcm_flush_channel(data->pcm, data->channel);
|
|
||||||
}
|
|
||||||
return 0; /* silenty ignore other actions */
|
|
||||||
}
|
|
||||||
|
|
||||||
int snd_pcm_plugin_build_block(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin)
|
int snd_pcm_plugin_build_block(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin)
|
||||||
{
|
{
|
||||||
struct block_private_data *data;
|
struct block_private_data *data;
|
||||||
|
|
@ -90,7 +75,6 @@ int snd_pcm_plugin_build_block(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r
|
||||||
data->pcm = pcm;
|
data->pcm = pcm;
|
||||||
data->channel = channel;
|
data->channel = channel;
|
||||||
plugin->transfer = block_transfer;
|
plugin->transfer = block_transfer;
|
||||||
plugin->action = block_action;
|
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,6 @@ static ssize_t mmap_transfer(snd_pcm_plugin_t *plugin,
|
||||||
static int mmap_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action)
|
static int mmap_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action)
|
||||||
{
|
{
|
||||||
struct mmap_private_data *data;
|
struct mmap_private_data *data;
|
||||||
int res;
|
|
||||||
|
|
||||||
if (plugin == NULL)
|
if (plugin == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
@ -217,14 +216,12 @@ static int mmap_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action)
|
||||||
if (data->control)
|
if (data->control)
|
||||||
snd_pcm_munmap(data->pcm, data->channel);
|
snd_pcm_munmap(data->pcm, data->channel);
|
||||||
return snd_pcm_mmap(data->pcm, data->channel, &data->control, (void **)&data->buffer);
|
return snd_pcm_mmap(data->pcm, data->channel, &data->control, (void **)&data->buffer);
|
||||||
|
} else if (action == PREPARE) {
|
||||||
|
data->frag = 0;
|
||||||
} else if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) {
|
} else if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) {
|
||||||
res = snd_pcm_drain_playback(data->pcm);
|
|
||||||
data->frag = 0;
|
data->frag = 0;
|
||||||
return res;
|
|
||||||
} else if (action == FLUSH) {
|
} else if (action == FLUSH) {
|
||||||
res = snd_pcm_flush_channel(data->pcm, data->channel);
|
|
||||||
data->frag = 0;
|
data->frag = 0;
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
return 0; /* silenty ignore other actions */
|
return 0; /* silenty ignore other actions */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,21 +55,6 @@ static ssize_t stream_transfer(snd_pcm_plugin_t *plugin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stream_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action)
|
|
||||||
{
|
|
||||||
struct stream_private_data *data;
|
|
||||||
|
|
||||||
if (plugin == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
data = (struct stream_private_data *)snd_pcm_plugin_extra_data(plugin);
|
|
||||||
if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) {
|
|
||||||
return snd_pcm_drain_playback(data->pcm);
|
|
||||||
} else if (action == FLUSH) {
|
|
||||||
return snd_pcm_flush_channel(data->pcm, data->channel);
|
|
||||||
}
|
|
||||||
return 0; /* silenty ignore other actions */
|
|
||||||
}
|
|
||||||
|
|
||||||
int snd_pcm_plugin_build_stream(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin)
|
int snd_pcm_plugin_build_stream(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin)
|
||||||
{
|
{
|
||||||
struct stream_private_data *data;
|
struct stream_private_data *data;
|
||||||
|
|
@ -90,7 +75,6 @@ int snd_pcm_plugin_build_stream(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **
|
||||||
data->pcm = pcm;
|
data->pcm = pcm;
|
||||||
data->channel = channel;
|
data->channel = channel;
|
||||||
plugin->transfer = stream_transfer;
|
plugin->transfer = stream_transfer;
|
||||||
plugin->action = stream_action;
|
|
||||||
*r_plugin = plugin;
|
*r_plugin = plugin;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue