alsa: Adjust to GVariant-based sr_config_* functions

This commit is contained in:
Bert Vermeulen 2013-03-31 20:55:39 +02:00
parent 3316e149d0
commit aa0dbd683c
3 changed files with 25 additions and 16 deletions

View File

@ -27,11 +27,10 @@
#include "libsigrok-internal.h" #include "libsigrok-internal.h"
#include "protocol.h" #include "protocol.h"
static const int hwcaps[] = { static const int32_t hwcaps[] = {
SR_CONF_SAMPLERATE, SR_CONF_SAMPLERATE,
SR_CONF_LIMIT_SAMPLES, SR_CONF_LIMIT_SAMPLES,
SR_CONF_CONTINUOUS, SR_CONF_CONTINUOUS,
0,
}; };
SR_PRIV struct sr_dev_driver alsa_driver_info; SR_PRIV struct sr_dev_driver alsa_driver_info;
@ -124,14 +123,14 @@ static int hw_cleanup(void)
return SR_OK; return SR_OK;
} }
static int config_get(int id, const void **data, const struct sr_dev_inst *sdi) static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi)
{ {
struct dev_context *devc; struct dev_context *devc;
switch (id) { switch (id) {
case SR_CONF_SAMPLERATE: case SR_CONF_SAMPLERATE:
devc = sdi->priv; devc = sdi->priv;
*data = &devc->cur_samplerate; *data = g_variant_new_uint64(devc->cur_samplerate);
break; break;
default: default:
return SR_ERR_ARG; return SR_ERR_ARG;
@ -140,7 +139,7 @@ static int config_get(int id, const void **data, const struct sr_dev_inst *sdi)
return SR_OK; return SR_OK;
} }
static int config_set(int id, const void *value, const struct sr_dev_inst *sdi) static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
{ {
struct dev_context *devc; struct dev_context *devc;
@ -148,10 +147,10 @@ static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
switch (id) { switch (id) {
case SR_CONF_SAMPLERATE: case SR_CONF_SAMPLERATE:
alsa_set_samplerate(sdi, *(const uint64_t *)value); alsa_set_samplerate(sdi, g_variant_get_uint64(data));
break; break;
case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_SAMPLES:
devc->limit_samples = *(const uint64_t *)value; devc->limit_samples = g_variant_get_uint64(data);
break; break;
default: default:
sr_err("Unknown capability: %d.", id); sr_err("Unknown capability: %d.", id);
@ -161,25 +160,35 @@ static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
return SR_OK; return SR_OK;
} }
static int config_list(int key, const void **data, const struct sr_dev_inst *sdi) static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi)
{ {
struct dev_context *devc; struct dev_context *devc;
GVariant *gvar;
GVariantBuilder gvb;
int i;
(void)sdi; (void)sdi;
switch (key) { switch (key) {
case SR_CONF_DEVICE_OPTIONS: case SR_CONF_DEVICE_OPTIONS:
*data = hwcaps; *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t));
break; break;
case SR_CONF_SAMPLERATE: case SR_CONF_SAMPLERATE:
if (!sdi || !sdi->priv) if (!sdi || !sdi->priv)
return SR_ERR_ARG; return SR_ERR_ARG;
devc = sdi->priv; devc = sdi->priv;
if (!devc->supp_rates.list) { if (!devc->samplerates) {
sr_err("Instance did not contain a samplerate list."); sr_err("Instance did not contain a samplerate list.");
return SR_ERR_ARG; return SR_ERR_ARG;
} }
*data = &devc->supp_rates; for (i = 0; devc->samplerates[i]; i++)
;
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"),
devc->samplerates, i, sizeof(uint64_t));
g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
*data = g_variant_builder_end(&gvb);
break; break;
default: default:
return SR_ERR_ARG; return SR_ERR_ARG;

View File

@ -152,7 +152,7 @@ static void alsa_scan_handle_dev(GSList **devices,
devc->num_probes = channels; devc->num_probes = channels;
devc->hw_params = hw_params; devc->hw_params = hw_params;
memcpy(devrates, hwrates, offset * sizeof(uint64_t)); memcpy(devrates, hwrates, offset * sizeof(uint64_t));
devc->supp_rates.list = devrates; devc->samplerates = devrates;
sdi->priv = devc; sdi->priv = devc;
sdi->driver = di; sdi->driver = di;
@ -294,7 +294,7 @@ SR_PRIV void alsa_dev_inst_clear(struct sr_dev_inst *sdi)
return; return;
snd_pcm_hw_params_free(devc->hw_params); snd_pcm_hw_params_free(devc->hw_params);
g_free((void*)devc->supp_rates.list); g_free((void*)devc->samplerates);
sr_dev_inst_free(sdi); sr_dev_inst_free(sdi);
} }
@ -326,11 +326,11 @@ SR_PRIV int alsa_set_samplerate(const struct sr_dev_inst *sdi,
i = 0; i = 0;
do { do {
if (newrate == devc->supp_rates.list[i]) { if (newrate == devc->samplerates[i]) {
rate = newrate; rate = newrate;
break; break;
} }
} while (devc->supp_rates.list[i++] != 0); } while (devc->samplerates[i++] != 0);
if (!rate) { if (!rate) {
sr_err("Sample rate %" PRIu64 " not supported.", newrate); sr_err("Sample rate %" PRIu64 " not supported.", newrate);

View File

@ -43,7 +43,7 @@ struct dev_context {
uint64_t limit_samples; uint64_t limit_samples;
uint64_t num_samples; uint64_t num_samples;
uint8_t num_probes; uint8_t num_probes;
struct sr_samplerates supp_rates; uint64_t *samplerates;
char *hwdev; char *hwdev;
snd_pcm_t *capture_handle; snd_pcm_t *capture_handle;
snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_t *hw_params;