* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "config.h" /* Must come before sigrok.h */
+/* Note: This driver doesn't compile, analog support in sigrok is WIP. */
+
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-#include <sigrok.h>
-#include <sigrok-internal.h>
#include <alsa/asoundlib.h>
+#include "sigrok.h"
+#include "sigrok-internal.h"
#define NUM_PROBES 2
#define SAMPLE_WIDTH 16
#define AUDIO_DEV "plughw:0,0"
+struct sr_analog_probe {
+ uint8_t att;
+ uint8_t res; /* Needs to be a power of 2, FIXME */
+ uint16_t val; /* Max hardware ADC width is 16bits */
+};
+
+struct sr_analog_sample {
+ uint8_t num_probes; /* Max hardware probes is 256 */
+ struct sr_analog_probe probes[];
+};
+
static int capabilities[] = {
SR_HWCAP_SAMPLERATE,
SR_HWCAP_LIMIT_SAMPLES,
SR_HWCAP_CONTINUOUS,
};
+static const char *probe_names[NUM_PROBES + 1] = {
+ "0",
+ "1",
+ NULL,
+};
+
static GSList *device_instances = NULL;
struct alsa {
return 0;
}
- sdi = sr_device_instance_new(0, SR_ST_ACTIVE, "alsa", NULL, NULL);
+ sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "alsa", NULL, NULL);
if (!sdi)
goto free_alsa;
struct alsa *alsa;
int err;
- if (!(sdi = sr_get_device_instance(device_instances, device_index)))
+ if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
return SR_ERR;
alsa = sdi->priv;
err = snd_pcm_open(&alsa->capture_handle, AUDIO_DEV,
SND_PCM_STREAM_CAPTURE, 0);
if (err < 0) {
- sr_warn("cannot open audio device %s (%s)", AUDIO_DEV,
- snd_strerror(err));
+ sr_err("cannot open audio device %s (%s)", AUDIO_DEV,
+ snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params_malloc(&alsa->hw_params);
if (err < 0) {
- sr_warn("cannot allocate hardware parameter structure (%s)",
- snd_strerror(err));
+ sr_err("cannot allocate hardware parameter structure (%s)",
+ snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params_any(alsa->capture_handle, alsa->hw_params);
if (err < 0) {
- sr_warn("cannot initialize hardware parameter structure (%s)",
- snd_strerror(err));
+ sr_err("cannot initialize hardware parameter structure (%s)",
+ snd_strerror(err));
return SR_ERR;
}
return SR_OK;
}
-static void hw_closedev(int device_index)
+static int hw_closedev(int device_index)
{
struct sr_device_instance *sdi;
struct alsa *alsa;
- if (!(sdi = sr_get_device_instance(device_instances, device_index)))
- return;
- alsa = sdi->priv;
- if (!alsa)
- return;
+ if (!(sdi = sr_dev_inst_get(device_instances, device_index))) {
+ sr_err("alsa: %s: sdi was NULL", __func__);
+ return SR_ERR; /* TODO: SR_ERR_ARG? */
+ }
+ if (!(alsa = sdi->priv)) {
+ sr_err("alsa: %s: sdi->priv was NULL", __func__);
+ return SR_ERR; /* TODO: SR_ERR_ARG? */
+ }
+
+ // TODO: Return values of snd_*?
if (alsa->hw_params)
snd_pcm_hw_params_free(alsa->hw_params);
if (alsa->capture_handle)
snd_pcm_close(alsa->capture_handle);
+
+ return SR_OK;
}
-static void hw_cleanup(void)
+static int hw_cleanup(void)
{
struct sr_device_instance *sdi;
- if (!(sdi = sr_get_device_instance(device_instances, 0)))
- return;
+ if (!(sdi = sr_dev_inst_get(device_instances, 0))) {
+ sr_err("alsa: %s: sdi was NULL", __func__);
+ return SR_ERR_BUG;
+ }
+
+ g_free(sdi->priv);
+ sr_dev_inst_free(sdi);
- free(sdi->priv);
- sr_device_instance_free(sdi);
+ return SR_OK;
}
static void *hw_get_device_info(int device_index, int device_info_id)
struct alsa *alsa;
void *info = NULL;
- if (!(sdi = sr_get_device_instance(device_instances, device_index)))
+ if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
return NULL;
alsa = sdi->priv;
case SR_DI_NUM_PROBES:
info = GINT_TO_POINTER(NUM_PROBES);
break;
+ case SR_DI_PROBE_NAMES:
+ info = probe_names;
+ break;
case SR_DI_CUR_SAMPLERATE:
info = &alsa->cur_rate;
break;
struct sr_device_instance *sdi;
struct alsa *alsa;
- if (!(sdi = sr_get_device_instance(device_instances, device_index)))
+ if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
return SR_ERR;
alsa = sdi->priv;
count = snd_pcm_readi(alsa->capture_handle, inb,
MIN(4096/4, alsa->limit_samples));
if (count < 1) {
- sr_warn("Failed to read samples");
+ sr_err("Failed to read samples");
return FALSE;
}
int count;
int err;
- if (!(sdi = sr_get_device_instance(device_instances, device_index)))
+ if (!(sdi = sr_dev_inst_get(device_instances, device_index)))
return SR_ERR;
alsa = sdi->priv;
err = snd_pcm_hw_params_set_access(alsa->capture_handle,
alsa->hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
if (err < 0) {
- sr_warn("cannot set access type (%s)", snd_strerror(err));
+ sr_err("cannot set access type (%s)", snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params_set_format(alsa->capture_handle,
alsa->hw_params, SND_PCM_FORMAT_S16_LE);
if (err < 0) {
- sr_warn("cannot set sample format (%s)", snd_strerror(err));
+ sr_err("cannot set sample format (%s)", snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params_set_rate_near(alsa->capture_handle,
alsa->hw_params, (unsigned int *) &alsa->cur_rate, 0);
if (err < 0) {
- sr_warn("cannot set sample rate (%s)", snd_strerror(err));
+ sr_err("cannot set sample rate (%s)", snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params_set_channels(alsa->capture_handle,
alsa->hw_params, NUM_PROBES);
if (err < 0) {
- sr_warn("cannot set channel count (%s)", snd_strerror(err));
+ sr_err("cannot set channel count (%s)", snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_hw_params(alsa->capture_handle, alsa->hw_params);
if (err < 0) {
- sr_warn("cannot set parameters (%s)", snd_strerror(err));
+ sr_err("cannot set parameters (%s)", snd_strerror(err));
return SR_ERR;
}
err = snd_pcm_prepare(alsa->capture_handle);
if (err < 0) {
- sr_warn("cannot prepare audio interface for use (%s)",
- snd_strerror(err));
+ sr_err("cannot prepare audio interface for use (%s)",
+ snd_strerror(err));
return SR_ERR;
}
count = snd_pcm_poll_descriptors_count(alsa->capture_handle);
if (count < 1) {
- sr_warn("Unable to obtain poll descriptors count");
+ sr_err("Unable to obtain poll descriptors count");
return SR_ERR;
}
if (!(ufds = g_try_malloc(count * sizeof(struct pollfd)))) {
- sr_warn("alsa: %s: ufds malloc failed", __func__);
+ sr_err("alsa: %s: ufds malloc failed", __func__);
return SR_ERR_MALLOC;
}
err = snd_pcm_poll_descriptors(alsa->capture_handle, ufds, count);
if (err < 0) {
- sr_warn("Unable to obtain poll descriptors (%s)",
- snd_strerror(err));
+ sr_err("Unable to obtain poll descriptors (%s)",
+ snd_strerror(err));
g_free(ufds);
return SR_ERR;
}
return SR_OK;
}
-static void hw_stop_acquisition(int device_index, gpointer session_device_id)
+static int hw_stop_acquisition(int device_index, gpointer session_device_id)
{
/* Avoid compiler warnings. */
device_index = device_index;
session_device_id = session_device_id;
+
+ return SR_OK;
}
-struct sr_device_plugin alsa_plugin_info = {
+SR_PRIV struct sr_device_plugin alsa_plugin_info = {
.name = "alsa",
.longname = "ALSA driver",
.api_version = 1,
.init = hw_init,
.cleanup = hw_cleanup,
- .open = hw_opendev,
- .close = hw_closedev,
+ .opendev = hw_opendev,
+ .closedev = hw_closedev,
.get_device_info = hw_get_device_info,
.get_status = hw_get_status,
.get_capabilities = hw_get_capabilities,