summaryrefslogtreecommitdiffstats
path: root/test-pull.c
diff options
context:
space:
mode:
Diffstat (limited to 'test-pull.c')
-rw-r--r--test-pull.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/test-pull.c b/test-pull.c
new file mode 100644
index 0000000..7f93906
--- /dev/null
+++ b/test-pull.c
@@ -0,0 +1,73 @@
+#include <errno.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "sydney.h"
+#include "macro.h"
+
+#define ASSERT_SUCCESS(x) do { \
+ int _r; \
+ if ((_r = x)) { \
+ fprintf(stderr, "Operation <%s> failed: %s%s%s\n", \
+ #x, \
+ sa_strerror(_r), \
+ _r == SA_ERROR_SYSTEM ? "; " : "", _r == SA_ERROR_SYSTEM ? strerror(errno) : ""); \
+ } \
+ assert(_r == SA_SUCCESS); \
+} while(0)
+
+#define FREQ 440
+
+static const float data[4] = { 0.0, 1.0, 0.0, -1.0 };
+
+static int callback(sa_stream_t *s, sa_event_t e) {
+ switch (e) {
+ case SA_EVENT_INIT_THREAD:
+ printf("Thread initialized.\n");
+ return 0;
+
+ case SA_EVENT_ERROR: {
+ int e;
+ ASSERT_SUCCESS(sa_stream_get_event_error(s, &e));
+ printf("Error: %s\n", sa_strerror(e));
+ return -1;
+ }
+
+ case SA_EVENT_NOTIFY:
+ printf("Notified.\n");
+ return 0;
+
+ case SA_EVENT_REQUEST_IO:
+
+ ASSERT_SUCCESS(sa_stream_write(s, data, sizeof(data)));
+ return 0;
+
+ case _SA_EVENT_MAX:
+ ;
+ }
+
+ sa_assert_not_reached();
+}
+
+int main(int argc, char *argv[]) {
+
+ sa_stream_t *s;
+
+ ASSERT_SUCCESS(sa_stream_create_pcm(&s, "Sine Test (pull)", SA_MODE_WRONLY, SA_PCM_FORMAT_FLOAT32_NE, FREQ * 4, 1));
+ ASSERT_SUCCESS(sa_stream_change_device(s, "/dev/dsp1"));
+ ASSERT_SUCCESS(sa_stream_open(s));
+
+ ASSERT_SUCCESS(sa_stream_start_thread(s, callback));
+
+ sleep(20);
+
+ ASSERT_SUCCESS(sa_stream_stop_thread(s));
+
+ ASSERT_SUCCESS(sa_stream_drain(s));
+
+ ASSERT_SUCCESS(sa_stream_destroy(s));
+
+ return 0;
+}