[alsa-devel] [PATCH] PCM parameters in file plugin

Takashi Iwai tiwai at suse.de
Thu Jan 29 09:28:43 CET 2009


At Thu, 29 Jan 2009 00:00:08 +0100,
Pavel Hofman wrote:
> 
> Takashi Iwai wrote:
> > At Mon, 19 Jan 2009 23:20:49 +0100,
> > Pavel Hofman wrote:
> >> @@ -84,6 +106,211 @@ typedef struct {
> >>  #define TO_LE16(x)	bswap_16(x)
> >>  #endif
> >>  
> >> +/* old_string MUST contain the key! */
> >> +int snd_pcm_file_replace_key(char *old_string, char *key, char *value,
> >> +		char **newstring_p)
> > 
> > Make this static.
> > 
> >> +{
> >> +	int str_index, newstr_index, key_index, end, new_len, old_len, cpy_len,
> >> +	    first_key_index;
> >> +	char *c, *first_c, *newstring;
> >> +	int keys_count;
> >> +
> >> +	first_c = c = (char *) strstr(old_string, key);
> > 
> > I guess this parser doesn't handle '%%' properly like printf()?
> > 
> >> +int snd_pcm_file_replace_fname(snd_pcm_file_t *file, char **new_fname_p)
> > 
> > Make it static.
> > 
> >> +int snd_pcm_file_has_keys(char *string)
> > 
> > Ditto.
> > 
> >> +int snd_pcm_file_open_output_file(snd_pcm_file_t *file)
> > 
> > Ditto.
> > 
> >> +	if (file->final_fname[0] == '|') {
> >> +		/* pipe mode */
> >> +		FILE *pipe;
> >> +		/* clearing */
> >> +		file->final_fname[0] = ' ';
> >> +		pipe = popen(file->final_fname, "w");
> > 
> > Pass "file->final_fname + 1", and you don't have to replace the pipe
> > with a space.
> > 
> > 
> > thanks,
> > 
> > Takashi
> 
> Hi Takashi,
> 
> Thanks a lot for your comments.
> 
> Please find enclosed a reworked patch which reflects your requests 
> including the %% functionality.

Thanks, it gets better now.

> +static int snd_pcm_file_replace_key(char format, const void *value_p,
> +		char **string_p, char **index_ch_p, int *len_p)

I think it could be easier to make value_str in the caller side.
That is,

static int snd_pcm_file_replace_key(char **string_p, char **index_ch_p,
	int *len_p, const char *value_str)
{
	char *value_str, *string, *index_ch;
	int index, len, value_len;
	/* input pointer values */
	len = *(len_p);
	string = *(string_p);
	index_ch = *(index_ch_p);

	/* reallocation to accommodate the value */
	index = index_ch - string;
	value_len = strlen(value_str);
	len += value_len;
	string = realloc(string, len + 1);
	if (!string)
		return -ENOMEM;
	index_ch = string + index;
	/* concatenating the new value */
	strcpy(index_ch, value_str);
	index_ch += value_len;
	/* return values */
	*(len_p) = len;
	*(string_p) = string;
	*(index_ch_p) = index_ch;
	return 0;
}

static int snd_pcm_file_replace_fname(snd_pcm_file_t *file, char **new_fname_p)
{
	char value[64];
...
	while (old_index_ch <= old_last_ch) {
...
		/* is %, skipping and checking next letter */
		switch (*(++old_index_ch)) {
		case RATE_KEY:
			snprintf(value, sizeof(value), "%d', pcm->rate);
			err = snd_pcm_file_replace_key(&new_fname,
				&new_index_ch, &new_len, value);
			if (err < 0)
				return err;
			break;

		case CHANNELS_KEY:
			snprintf(value, sizeof(value), "%d', pcm->channels);
			err = snd_pcm_file_replace_key(&new_fname,
				&new_index_ch, &new_len, value);
			if (err < 0)
				return err;
			break;
....
		case FORMAT_KEY:
			err = snd_pcm_file_replace_key(&new_fname,
				&new_index_ch, &new_len,
				snd_pcm_format_name(pcm->format));
			if (err < 0)
				return err;
			break;
...


Takashi


More information about the Alsa-devel mailing list