diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2017-08-28 17:59:39 +0200 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2017-08-28 17:59:39 +0200 |
| commit | f63ce92e6009801e545d3f2d3c4c9e90acd1b491 (patch) | |
| tree | e5b8a5579bfdb49e24efae686491bc38978ad61d /looper.py | |
Initial import of script for dumping wav data
Diffstat (limited to 'looper.py')
| -rwxr-xr-x | looper.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/looper.py b/looper.py new file mode 100755 index 0000000..f2f2749 --- /dev/null +++ b/looper.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 + +import random +import struct +import sys +import usb.core +import usb.util + +LOOPER_VID = 0x0483 +LOOPER_PID = 0x572a + +ENDPOINT_IN = 0x81 +ENDPOINT_OUT = 0x01 + +COMMAND_SIZE = 0xfe +COMMAND_DATA = 0xff + +def mass_storage_header(data_len, cdb_len): + header = bytes([ord('U'), ord('S'), ord('B'), ord('C')]) + tag = random.randint(0, 1<<32 - 1) + flags = 0x80 + target = 0x00 + header += struct.pack('<iiBBB', tag, data_len, flags, target, cdb_len) + return header + +def command_header(command, data_len, flag1, flag2): + cdb = bytes([0xcb, command, flag1, 0x00, flag2, 0x00, 0x00, 0x00, 0x00, 0x00]) + header = mass_storage_header(data_len, len(cdb)) + cdb + header += bytes([0x00 for padding in range(31-len(header))]) + return header + +def ack_data(dev): + dev.read(ENDPOINT_IN, 32) + +def get_size(dev): + header = command_header(COMMAND_SIZE, 5, 0x00, 0x01) + dev.write(ENDPOINT_OUT, header) + length = dev.read(ENDPOINT_IN, 100) + ack_data(dev) + if length[0] == 1: + return 0 + return length[1] + (length[2] << 8) + (length[3] << 16) + (length[4] << 24) + +def get_data(dev, nbytes): + header = command_header(COMMAND_DATA, nbytes, 0x01, 0x01) + dev.write(ENDPOINT_OUT, header) + buf = dev.read(ENDPOINT_IN, nbytes) + ack_data(dev) + print('.', end='', flush=True), + return buf + +def send_data(dev, data): + header = command_header(COMMAND_DATA, len(data), 0x01, 0x00) + dev.write(ENDPOINT_OUT, header) + #dev.read(ENDPOINT_IN, 100) + dev.write(ENDPOINT_OUT, data) + +def send_stop(dev): + header = command_header(COMMAND_SIZE, 5, 0x00, 0x00) + +def write_wav_header(outfile): + pass + +dev = usb.core.find(idVendor=LOOPER_VID, idProduct=LOOPER_PID) +if not dev: + print("Device not found.") + sys.exit(1) +if dev.is_kernel_driver_active(0): + dev.detach_kernel_driver(0) +dev.set_configuration() + +size = get_size(dev) +if size == 0: + print("No data available.") + sys.exit(0) + +with open("/tmp/dump.wav", 'wb') as outfile: + write_wav_header(outfile) + print("Receiving ", end='', flush=True) + while size > 0: + bufsize = (size >= 65536) and 65536 or size + # data needs to be transferred in multiples of 1k blocks + padding = (1024 - (bufsize % 1024)) % 1024 + + buf = get_data(dev, bufsize + padding) + outfile.write(buf[:bufsize]) + size -= bufsize + print(" Done.") |
