blob: fbb384de71bd6f39fdc734e343b495414fc87633 [file] [log] [blame]
/*
* Copyright 2018 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <alsa/asoundlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "alsa_conformance_args.h"
#define MAX_DEVICE_NAME_LENGTH 50
struct alsa_conformance_args {
char *playback_dev_name;
char *capture_dev_name;
unsigned int channels;
snd_pcm_format_t format;
unsigned int rate;
snd_pcm_uframes_t period_size;
unsigned int block_size;
double duration;
char *device_file;
int dev_info_only;
int iterations;
double merge_threshold;
};
struct alsa_conformance_args *args_create()
{
struct alsa_conformance_args *args;
args = (struct alsa_conformance_args *)malloc(
sizeof(struct alsa_conformance_args));
if (!args) {
perror("malloc (alsa_conformance_args)");
exit(EXIT_FAILURE);
}
/* set default value */
args->playback_dev_name = NULL;
args->capture_dev_name = NULL;
args->channels = 2;
args->format = SND_PCM_FORMAT_S16_LE;
args->rate = 48000;
args->period_size = 0;
args->block_size = 240;
args->duration = 1.0;
args->device_file = NULL;
args->dev_info_only = false;
args->iterations = 1;
args->merge_threshold = 0.0001;
return args;
}
void args_destroy(struct alsa_conformance_args *args)
{
free(args->playback_dev_name);
free(args->capture_dev_name);
free(args->device_file);
free(args);
}
const char *args_get_playback_dev_name(const struct alsa_conformance_args *args)
{
return args->playback_dev_name;
}
const char *args_get_capture_dev_name(const struct alsa_conformance_args *args)
{
return args->capture_dev_name;
}
unsigned int args_get_channels(const struct alsa_conformance_args *args)
{
return args->channels;
}
snd_pcm_format_t args_get_format(const struct alsa_conformance_args *args)
{
return args->format;
}
unsigned int args_get_rate(const struct alsa_conformance_args *args)
{
return args->rate;
}
snd_pcm_uframes_t args_get_period_size(const struct alsa_conformance_args *args)
{
return args->period_size;
}
unsigned int args_get_block_size(const struct alsa_conformance_args *args)
{
return args->block_size;
}
double args_get_duration(const struct alsa_conformance_args *args)
{
return args->duration;
}
const char *args_get_device_file(const struct alsa_conformance_args *args)
{
return args->device_file;
}
int args_get_dev_info_only(const struct alsa_conformance_args *args)
{
return args->dev_info_only;
}
int args_get_iterations(const struct alsa_conformance_args *args)
{
return args->iterations;
}
double args_get_merge_threshold(const struct alsa_conformance_args *args)
{
return args->merge_threshold;
}
void args_set_playback_dev_name(struct alsa_conformance_args *args,
const char *name)
{
free(args->playback_dev_name);
args->playback_dev_name = strndup(name, MAX_DEVICE_NAME_LENGTH);
}
void args_set_capture_dev_name(struct alsa_conformance_args *args,
const char *name)
{
free(args->capture_dev_name);
args->capture_dev_name = strndup(name, MAX_DEVICE_NAME_LENGTH);
}
void args_set_channels(struct alsa_conformance_args *args,
unsigned int channels)
{
args->channels = channels;
}
void args_set_format(struct alsa_conformance_args *args, const char *format_str)
{
snd_pcm_format_t format;
format = snd_pcm_format_value(format_str);
if (format == SND_PCM_FORMAT_UNKNOWN) {
fprintf(stderr, "unknown format: %s\n", format_str);
exit(EXIT_FAILURE);
}
args->format = format;
}
void args_set_rate(struct alsa_conformance_args *args, unsigned int rate)
{
args->rate = rate;
}
void args_set_period_size(struct alsa_conformance_args *args,
unsigned int period_size)
{
args->period_size = (snd_pcm_uframes_t)period_size;
}
void args_set_block_size(struct alsa_conformance_args *args, unsigned int size)
{
args->block_size = size;
}
void args_set_duration(struct alsa_conformance_args *args, double duration)
{
args->duration = duration;
}
void args_set_device_file(struct alsa_conformance_args *args, const char *name)
{
free(args->device_file);
args->device_file = strdup(name);
}
void args_set_dev_info_only(struct alsa_conformance_args *args, int flag)
{
args->dev_info_only = flag;
}
void args_set_iterations(struct alsa_conformance_args *args, int iterations)
{
args->iterations = iterations;
}
void args_set_merge_threshold(struct alsa_conformance_args *args,
double merge_threshold)
{
args->merge_threshold = merge_threshold;
}