shithub: m8c

Download patch

ref: 64823563d4d05c4eb8a8c18bd63f45bfa54e6dfd
parent: 1fb43347e61f11fe9e8b079409f727c1f3450fbd
author: Maido Käära <maido@producement.com>
date: Mon Dec 12 11:37:43 EST 2022

Expose handle

--- a/audio.c
+++ /dev/null
@@ -1,158 +1,0 @@
-#include <libusb.h>
-#include <errno.h>
-#include <android/log.h>
-#include <jni.h>
-#include <SDL_audio.h>
-#include <SDL_log.h>
-#include "audio.h"
-
-#define EP_ISO_IN    0x85
-#define IFACE_NUM   4
-
-#define NUM_TRANSFERS 10
-#define PACKET_SIZE 180
-#define NUM_PACKETS 10
-
-static unsigned long num_bytes = 0, num_xfer = 0;
-static struct timeval tv_start;
-
-static int do_exit = 1;
-
-static void cb_xfr(struct libusb_transfer *xfr) {
-    unsigned int i;
-
-    int len = 0;
-
-    for (i = 0; i < xfr->num_iso_packets; i++) {
-        struct libusb_iso_packet_descriptor *pack = &xfr->iso_packet_desc[i];
-
-        if (pack->status != LIBUSB_TRANSFER_COMPLETED) {
-            SDL_Log("Error (status %d: %s) :", pack->status,
-                    libusb_error_name(pack->status));
-            /* This doesn't happen, so bail out if it does. */
-            exit(EXIT_FAILURE);
-        }
-
-        const uint8_t *data = libusb_get_iso_packet_buffer_simple(xfr, i);
-
-        SDL_QueueAudio(1, data, pack->actual_length);
-
-        len += pack->length;
-    }
-
-    num_bytes += len;
-    num_xfer++;
-
-    if (libusb_submit_transfer(xfr) < 0) {
-        SDL_Log("error re-submitting URB\n");
-        exit(1);
-    }
-
-}
-
-static int benchmark_in(libusb_device_handle *devh, uint8_t ep) {
-    static uint8_t buf[PACKET_SIZE * NUM_PACKETS];
-    static struct libusb_transfer *xfr[NUM_TRANSFERS];
-    int num_iso_pack = NUM_PACKETS;
-    int i;
-
-    /* NOTE: To reach maximum possible performance the program must
-     * submit *multiple* transfers here, not just one.
-     *
-     * When only one transfer is submitted there is a gap in the bus
-     * schedule from when the transfer completes until a new transfer
-     * is submitted by the callback. This causes some jitter for
-     * isochronous transfers and loss of throughput for bulk transfers.
-     *
-     * This is avoided by queueing multiple transfers in advance, so
-     * that the host controller is always kept busy, and will schedule
-     * more transfers on the bus while the callback is running for
-     * transfers which have completed on the bus.
-     */
-    for (i = 0; i < NUM_TRANSFERS; i++) {
-        xfr[i] = libusb_alloc_transfer(num_iso_pack);
-        if (!xfr[i]) {
-            SDL_Log("Could not allocate transfer");
-            return -ENOMEM;
-        }
-
-        libusb_fill_iso_transfer(xfr[i], devh, ep, buf,
-                                 sizeof(buf), num_iso_pack, cb_xfr, NULL, 1000);
-        libusb_set_iso_packet_lengths(xfr[i], sizeof(buf) / num_iso_pack);
-
-        libusb_submit_transfer(xfr[i]);
-    }
-
-    gettimeofday(&tv_start, NULL);
-
-    return 1;
-}
-
-int audio_setup(libusb_device_handle *devh) {
-    SDL_Log("UsbAudio setup");
-
-    int rc;
-
-    rc = libusb_kernel_driver_active(devh, IFACE_NUM);
-    if (rc == 1) {
-        SDL_Log("Detaching kernel driver");
-        rc = libusb_detach_kernel_driver(devh, IFACE_NUM);
-        if (rc < 0) {
-            SDL_Log("Could not detach kernel driver: %s\n",
-                    libusb_error_name(rc));
-            libusb_close(devh);
-            libusb_exit(NULL);
-            return rc;
-        }
-    }
-
-    rc = libusb_claim_interface(devh, IFACE_NUM);
-    if (rc < 0) {
-        SDL_Log("Error claiming interface: %s\n", libusb_error_name(rc));
-        libusb_close(devh);
-        libusb_exit(NULL);
-        return rc;
-    }
-
-    rc = libusb_set_interface_alt_setting(devh, IFACE_NUM, 1);
-    if (rc < 0) {
-        SDL_Log("Error setting alt setting: %s\n", libusb_error_name(rc));
-        libusb_close(devh);
-        libusb_exit(NULL);
-        return rc;
-    }
-
-
-// Good to go
-    do_exit = 0;
-    SDL_Log("Starting capture");
-    if ((rc = benchmark_in(devh, EP_ISO_IN)) < 0) {
-        SDL_Log("Capture failed to start: %d", rc);
-        return rc;
-    }
-
-    static SDL_AudioSpec audio_spec;
-    audio_spec.format = AUDIO_S16;
-    audio_spec.channels = 2;
-    audio_spec.freq = 44100;
-
-    if (SDL_OpenAudio(&audio_spec, NULL) < 0) {
-        SDL_Log("Couldn't open audio: %s\n", SDL_GetError());
-        exit(-1);
-    }
-
-    SDL_PauseAudio(0);
-
-    SDL_Log("Successful init");
-    return 1;
-}
-
-JNIEXPORT void JNICALL
-Java_io_maido_m8client_M8SDLActivity_loop(JNIEnv *env, jobject thiz) {
-    while (!do_exit) {
-        int rc = libusb_handle_events(NULL);
-        if (rc != LIBUSB_SUCCESS) {
-            break;
-        }
-    }
-}
--- a/audio.h
+++ /dev/null
@@ -1,6 +1,0 @@
-#ifndef _AUDIO_H_
-#define _AUDIO_H_
-
-int audio_setup(libusb_device_handle *devh);
-
-#endif
--- a/serial.c
+++ b/serial.c
@@ -16,10 +16,7 @@
 #ifdef USE_LIBUSB
 
 #include <libusb.h>
-#include "audio.h"
 
-#define UNUSED __attribute__((unused))
-
 static int ep_out_addr = 0x03;
 static int ep_in_addr = 0x83;
 
@@ -91,6 +88,10 @@
     return 0;
 }
 
+libusb_device_handle *get_handle() {
+    return devh;
+}
+
 int init_serial(int verbose) {
 
     if (devh != NULL) {
@@ -152,7 +153,7 @@
         return 0;
     }
 
-    return audio_setup(devh);
+    return 1;
 }
 
 int reset_display() {
--- a/serial.h
+++ b/serial.h
@@ -7,7 +7,9 @@
 #ifdef USE_LIBUSB
 // Not sure about this value but it seems to work
 #define serial_read_size 512
+#include <libusb.h>
 void set_file_descriptor(int fd);
+libusb_device_handle *get_handle();
 #else
 // maximum amount of bytes to read from the serial in one read()
 #define serial_read_size 324
--