mirror of https://github.com/nealey/hdjd.git
Fix an URB and memory leak
This commit is contained in:
parent
857a549618
commit
0f33b2745d
5
Makefile
5
Makefile
|
@ -1,8 +1,9 @@
|
||||||
CFLAGS += -Wall
|
CFLAGS += -Wall
|
||||||
CFLAGS += -Werror
|
CFLAGS += -Werror
|
||||||
|
TARGETS = hdjd aac123 explore
|
||||||
CFLAGS += -g
|
CFLAGS += -g
|
||||||
|
|
||||||
all: hdjd aac123 explore
|
all: $(TARGETS)
|
||||||
|
|
||||||
hdjd: LDFLAGS += $(shell pkg-config --libs libusb-1.0)
|
hdjd: LDFLAGS += $(shell pkg-config --libs libusb-1.0)
|
||||||
hdjd: LDFLAGS += $(shell pkg-config --libs alsa)
|
hdjd: LDFLAGS += $(shell pkg-config --libs alsa)
|
||||||
|
@ -23,4 +24,4 @@ aactest: LDLIBS += $(shell pkg-config --libs alsa)
|
||||||
aactest: LDLIBS += -lfaad -lmp4v2
|
aactest: LDLIBS += -lfaad -lmp4v2
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f hdjd *.o
|
rm -f $(TARGETS) *.o
|
||||||
|
|
19
aac123.c
19
aac123.c
|
@ -5,25 +5,13 @@
|
||||||
#include <neaacdec.h>
|
#include <neaacdec.h>
|
||||||
#include <mp4v2/mp4v2.h>
|
#include <mp4v2/mp4v2.h>
|
||||||
|
|
||||||
/* Some things I use for debugging */
|
#include "dump.h"
|
||||||
#ifdef NODUMP
|
|
||||||
# define DUMPf(fmt, args...)
|
|
||||||
#else
|
|
||||||
# define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
|
||||||
#endif
|
|
||||||
#define DUMP() DUMPf("")
|
|
||||||
#define DUMP_d(v) DUMPf("%s = %d", #v, v)
|
|
||||||
#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
|
|
||||||
#define DUMP_s(v) DUMPf("%s = %s", #v, v)
|
|
||||||
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
|
|
||||||
#define DUMP_p(v) DUMPf("%s = %p", #v, v)
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
GetAACTrack(MP4FileHandle *infile)
|
GetAACTrack(MP4FileHandle *infile)
|
||||||
{
|
{
|
||||||
/* find AAC track */
|
/* find AAC track */
|
||||||
int rc;
|
|
||||||
MP4TrackId numTracks = MP4GetNumberOfTracks(infile, NULL, 0);
|
MP4TrackId numTracks = MP4GetNumberOfTracks(infile, NULL, 0);
|
||||||
MP4TrackId i;
|
MP4TrackId i;
|
||||||
|
|
||||||
|
@ -66,10 +54,9 @@ play_file(snd_pcm_t *snd, char *fn)
|
||||||
|
|
||||||
NeAACDecHandle hDecoder;
|
NeAACDecHandle hDecoder;
|
||||||
NeAACDecConfigurationPtr config;
|
NeAACDecConfigurationPtr config;
|
||||||
mp4AudioSpecificConfig mp4ASC;
|
|
||||||
|
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
int buffer_size;
|
uint32_t buffer_size;
|
||||||
unsigned long samplerate;
|
unsigned long samplerate;
|
||||||
unsigned char channels;
|
unsigned char channels;
|
||||||
|
|
||||||
|
@ -124,9 +111,7 @@ play_file(snd_pcm_t *snd, char *fn)
|
||||||
DUMP_d(numSamples);
|
DUMP_d(numSamples);
|
||||||
for (sampleId = 1; sampleId <= numSamples; sampleId++) {
|
for (sampleId = 1; sampleId <= numSamples; sampleId++) {
|
||||||
int rc;
|
int rc;
|
||||||
long dur;
|
|
||||||
unsigned int sample_count;
|
unsigned int sample_count;
|
||||||
unsigned int delay = 0;
|
|
||||||
NeAACDecFrameInfo frameInfo;
|
NeAACDecFrameInfo frameInfo;
|
||||||
|
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
|
|
5
alsa.c
5
alsa.c
|
@ -82,6 +82,7 @@ alsa_read_ready()
|
||||||
usb_write(buf, converted);
|
usb_write(buf, converted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
snd_midi_event_free(midi_event_parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -120,10 +121,10 @@ alsa_write(uint8_t *data, size_t datalen)
|
||||||
snd_seq_ev_set_direct(&ev);
|
snd_seq_ev_set_direct(&ev);
|
||||||
snd_seq_ev_set_source(&ev, seq_port);
|
snd_seq_ev_set_source(&ev, seq_port);
|
||||||
snd_seq_ev_set_subs(&ev);
|
snd_seq_ev_set_subs(&ev);
|
||||||
if ((r = snd_seq_event_output(snd_handle, &ev)) < 0) {
|
if ((r = snd_seq_event_output_direct(snd_handle, &ev)) < 0) {
|
||||||
fprintf(stderr, "ALSA couldn't write an event: %ld\n", r);
|
fprintf(stderr, "ALSA couldn't write an event: %ld\n", r);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_seq_drain_output(snd_handle);
|
snd_midi_event_free(midi_event_parser);
|
||||||
}
|
}
|
14
dump.h
14
dump.h
|
@ -1,11 +1,5 @@
|
||||||
/* obj.h: objecty and exceptiony stuff
|
#ifndef __DUMP_H__
|
||||||
*
|
#define __DUMP_H__
|
||||||
* Some macros to make C a bit more like C++, but without bringing in
|
|
||||||
* all of C++'s crapola.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __OBJ_H__
|
|
||||||
#define __OBJ_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -18,8 +12,8 @@
|
||||||
# define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
# define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
||||||
#endif
|
#endif
|
||||||
#define DUMP() DUMPf("")
|
#define DUMP() DUMPf("")
|
||||||
#define DUMP_d(v) DUMPf("%s = %d", #v, v)
|
#define DUMP_d(v) DUMPf("%s = %d", #v, (int)v)
|
||||||
#define DUMP_l(v) DUMPf("%s = %ld", #v, v)
|
#define DUMP_l(v) DUMPf("%s = %ld", #v, (long)v)
|
||||||
#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
|
#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
|
||||||
#define DUMP_s(v) DUMPf("%s = %s", #v, v)
|
#define DUMP_s(v) DUMPf("%s = %s", #v, v)
|
||||||
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
|
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
|
||||||
|
|
18
usb.c
18
usb.c
|
@ -11,6 +11,9 @@
|
||||||
static struct libusb_device_handle *usb_dev;
|
static struct libusb_device_handle *usb_dev;
|
||||||
static const struct device *d;
|
static const struct device *d;
|
||||||
|
|
||||||
|
static int writes_pending = 0;
|
||||||
|
static int reads_pending = 0;
|
||||||
|
|
||||||
struct device {
|
struct device {
|
||||||
uint16_t product_id;
|
uint16_t product_id;
|
||||||
uint8_t ep_in;
|
uint8_t ep_in;
|
||||||
|
@ -36,6 +39,8 @@ usb_initiate_transfer()
|
||||||
struct libusb_transfer *xfer = libusb_alloc_transfer(0);
|
struct libusb_transfer *xfer = libusb_alloc_transfer(0);
|
||||||
libusb_fill_bulk_transfer(xfer, usb_dev, d->ep_in, buf, 256, usb_xfer_done, NULL, 0);
|
libusb_fill_bulk_transfer(xfer, usb_dev, d->ep_in, buf, 256, usb_xfer_done, NULL, 0);
|
||||||
libusb_submit_transfer(xfer);
|
libusb_submit_transfer(xfer);
|
||||||
|
DUMP();
|
||||||
|
reads_pending += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -43,7 +48,10 @@ usb_xfer_done(struct libusb_transfer *xfer)
|
||||||
{
|
{
|
||||||
uint8_t *data = xfer->buffer;
|
uint8_t *data = xfer->buffer;
|
||||||
int datalen = xfer->actual_length;
|
int datalen = xfer->actual_length;
|
||||||
|
|
||||||
|
reads_pending -= 1;
|
||||||
|
|
||||||
|
DUMP();
|
||||||
alsa_write(data, datalen);
|
alsa_write(data, datalen);
|
||||||
free(data);
|
free(data);
|
||||||
libusb_free_transfer(xfer);
|
libusb_free_transfer(xfer);
|
||||||
|
@ -54,7 +62,7 @@ int
|
||||||
usb_setup(char *name, size_t namelen)
|
usb_setup(char *name, size_t namelen)
|
||||||
{
|
{
|
||||||
if (libusb_init(NULL) < 0) {
|
if (libusb_init(NULL) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libusb_pollfds_handle_timeouts(NULL) == 0) {
|
if (libusb_pollfds_handle_timeouts(NULL) == 0) {
|
||||||
|
@ -93,6 +101,7 @@ usb_setup(char *name, size_t namelen)
|
||||||
printf("Opened [%s]\n", name);
|
printf("Opened [%s]\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usb_initiate_transfer();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -117,7 +126,10 @@ usb_fd_setup(int *nfds, fd_set *rfds, fd_set *wfds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_initiate_transfer();
|
if (reads_pending + writes_pending > 10) {
|
||||||
|
fprintf(stderr, "Warning: %d+%d = %d outstanding USB transactions!\n", reads_pending, writes_pending, reads_pending + writes_pending);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -140,6 +152,7 @@ usb_check_fds(fd_set *rfds, fd_set *wfds)
|
||||||
void
|
void
|
||||||
usb_write_done(struct libusb_transfer *xfer)
|
usb_write_done(struct libusb_transfer *xfer)
|
||||||
{
|
{
|
||||||
|
writes_pending -= 1;
|
||||||
free(xfer->buffer);
|
free(xfer->buffer);
|
||||||
libusb_free_transfer(xfer);
|
libusb_free_transfer(xfer);
|
||||||
}
|
}
|
||||||
|
@ -150,6 +163,7 @@ usb_write(uint8_t *data, size_t datalen)
|
||||||
struct libusb_transfer *xfer;
|
struct libusb_transfer *xfer;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
|
||||||
|
writes_pending += 1;
|
||||||
xfer = libusb_alloc_transfer(0);
|
xfer = libusb_alloc_transfer(0);
|
||||||
buf = (unsigned char *)malloc(datalen);
|
buf = (unsigned char *)malloc(datalen);
|
||||||
memcpy(buf, data, datalen);
|
memcpy(buf, data, datalen);
|
||||||
|
|
Loading…
Reference in New Issue