projects
/
paraslash.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improve memory mapping.
[paraslash.git]
/
alsa_write.c
diff --git
a/alsa_write.c
b/alsa_write.c
index 8e8b693c2f99752ea2ce1d9b7481084d6dcb0150..ae471679f076f17fbce5b3d8d27ed5458d1fb4cd 100644
(file)
--- a/
alsa_write.c
+++ b/
alsa_write.c
@@
-21,6
+21,7
@@
#include "string.h"
#include "list.h"
#include "sched.h"
#include "string.h"
#include "list.h"
#include "sched.h"
+#include "ggo.h"
#include "write.h"
#include "alsa_write.cmdline.h"
#include "error.h"
#include "write.h"
#include "alsa_write.cmdline.h"
#include "error.h"
@@
-41,7
+42,7
@@
struct private_alsa_write_data {
/**
* the samplerate given by command line option or the decoder
* of the writer node group
/**
* the samplerate given by command line option or the decoder
* of the writer node group
- */
+ */
unsigned samplerate;
/**
* the number of channels, also given by command line option or the
unsigned samplerate;
/**
* the number of channels, also given by command line option or the
@@
-133,8
+134,9
@@
static int alsa_open(struct writer_node *w)
return -E_SW_PARAMS;
pad->bytes_per_frame = snd_pcm_format_physical_width(FORMAT)
* pad->channels / 8;
return -E_SW_PARAMS;
pad->bytes_per_frame = snd_pcm_format_physical_width(FORMAT)
* pad->channels / 8;
+ PARA_INFO_LOG("bytes per frame: %zu\n", pad->bytes_per_frame);
if (snd_pcm_nonblock(pad->handle, 1))
if (snd_pcm_nonblock(pad->handle, 1))
- PARA_ERROR_LOG("
%s\n", "failed to set nonblock mode
");
+ PARA_ERROR_LOG("
failed to set nonblock mode\n
");
return period_size * pad->bytes_per_frame;
}
return period_size * pad->bytes_per_frame;
}
@@
-186,14
+188,16
@@
static int alsa_write_post_select(__a_unused struct sched *s,
frames, (int)ret);
return -E_ALSA_WRITE;
}
frames, (int)ret);
return -E_ALSA_WRITE;
}
- if (ret == -EAGAIN) { /* try again in 5ms */
- PARA_WARNING_LOG("EAGAIN\n");
- ms2tv(5, &tv);
- } else {
+ if (ret == -EAGAIN)
+ PARA_DEBUG_LOG("EAGAIN\n");
+ else
wn->written += ret * pad->bytes_per_frame;
wn->written += ret * pad->bytes_per_frame;
- ms2tv(pad->buffer_time / 4000, &tv);
+ if (ret == frames) /* we wrote everything, try again immediately */
+ pad->next_chunk = *now;
+ else {
+ ms2tv(pad->buffer_time / pad->bytes_per_frame / 1000, &tv);
+ tv_add(now, &tv, &pad->next_chunk);
}
}
- tv_add(now, &tv, &pad->next_chunk);
return 1;
}
return 1;
}
@@
-209,10
+213,12
@@
static void alsa_close(struct writer_node *wn)
__malloc static void *alsa_parse_config(const char *options)
{
__malloc static void *alsa_parse_config(const char *options)
{
+ int ret;
struct alsa_write_args_info *conf
= para_calloc(sizeof(struct alsa_write_args_info));
struct alsa_write_args_info *conf
= para_calloc(sizeof(struct alsa_write_args_info));
+
PARA_INFO_LOG("options: %s, %zd\n", options, strcspn(options, " \t"));
PARA_INFO_LOG("options: %s, %zd\n", options, strcspn(options, " \t"));
-
int
ret = alsa_cmdline_parser_string(options, conf, "alsa_write");
+ ret = alsa_cmdline_parser_string(options, conf, "alsa_write");
if (ret)
goto err_out;
PARA_INFO_LOG("help given: %d\n", conf->help_given);
if (ret)
goto err_out;
PARA_INFO_LOG("help given: %d\n", conf->help_given);
@@
-231,10
+237,17
@@
err_out:
*/
void alsa_write_init(struct writer *w)
{
*/
void alsa_write_init(struct writer *w)
{
+ struct alsa_write_args_info dummy;
+
+ alsa_cmdline_parser_init(&dummy);
w->open = alsa_open;
w->close = alsa_close;
w->pre_select = alsa_write_pre_select;
w->post_select = alsa_write_post_select;
w->parse_config = alsa_parse_config;
w->shutdown = NULL; /* nothing to do */
w->open = alsa_open;
w->close = alsa_close;
w->pre_select = alsa_write_pre_select;
w->post_select = alsa_write_post_select;
w->parse_config = alsa_parse_config;
w->shutdown = NULL; /* nothing to do */
+ w->help = (struct ggo_help) {
+ .short_help = alsa_write_args_info_help,
+ .detailed_help = alsa_write_args_info_detailed_help
+ };
}
}