steel support

This commit is contained in:
Neale Pickett 2013-04-12 11:18:58 -06:00
parent 96957e8305
commit dcaa85e4bb
3 changed files with 76 additions and 102 deletions

View File

@ -6,4 +6,8 @@ hdjd: LDFLAGS += $(shell pkg-config --libs libusb-1.0)
aac123: CFLAGS += $(shell pkg-config --cflags alsa)
aac123: LDLIBS += $(shell pkg-config --libs alsa)
aac123: LDLIBS += -lfaad -lmp4ff
aac123: LDLIBS += -lfaad -lmp4v2
aactest: CFLAGS += $(shell pkg-config --cflags alsa)
aactest: LDLIBS += $(shell pkg-config --libs alsa)
aactest: LDLIBS += -lfaad -lmp4v2

View File

@ -3,7 +3,7 @@
#include <alsa/asoundlib.h>
#include <neaacdec.h>
#include <mp4ff.h>
#include <mp4v2/mp4v2.h>
/* Some things I use for debugging */
#ifdef NODUMP
@ -19,41 +19,36 @@
#define DUMP_p(v) DUMPf("%s = %p", #v, v)
uint32_t
read_callback(void *user_data, void *buffer, uint32_t length)
{
return fread(buffer, 1, length, (FILE*)user_data);
}
uint32_t
seek_callback(void *user_data, uint64_t position)
{
return fseek((FILE*)user_data, position, SEEK_SET);
}
static int
GetAACTrack(mp4ff_t *infile)
GetAACTrack(MP4FileHandle *infile)
{
/* find AAC track */
int i, rc;
int numTracks = mp4ff_total_tracks(infile);
int rc;
MP4TrackId numTracks = MP4GetNumberOfTracks(infile, NULL, 0);
MP4TrackId i;
for (i = 0; i < numTracks; i++)
for (i = 1; i <= numTracks; i++)
{
unsigned char *buff = NULL;
int buff_size = 0;
mp4AudioSpecificConfig mp4ASC;
uint8_t obj_type;
const char *track_type = MP4GetTrackType(infile, i);
mp4ff_get_decoder_config(infile, i, &buff, &buff_size);
if (! track_type) continue;
if (buff)
{
rc = NeAACDecAudioSpecificConfig(buff, buff_size, &mp4ASC);
free(buff);
if (!MP4_IS_AUDIO_TRACK_TYPE(track_type)) continue;
if (rc < 0)
continue;
return i;
/* MP4GetTrackAudioType */
obj_type = MP4GetTrackEsdsObjectTypeId(infile, i);
if (obj_type == MP4_INVALID_AUDIO_TYPE)
continue;
if (obj_type == MP4_MPEG4_AUDIO_TYPE) {
obj_type = MP4GetTrackAudioMpeg4Type(infile, i);
if (MP4_IS_MPEG4_AAC_AUDIO_TYPE(obj_type))
return i;
} else {
if (MP4_IS_AAC_AUDIO_TYPE(obj_type))
return i;
}
}
@ -62,13 +57,12 @@ GetAACTrack(mp4ff_t *infile)
}
int
play_file(snd_pcm_t *snd, FILE *f)
play_file(snd_pcm_t *snd, char *fn)
{
int track;
mp4ff_t *infile;
mp4ff_callback_t mp4cb;
MP4FileHandle infile;
NeAACDecHandle hDecoder;
NeAACDecConfigurationPtr config;
@ -82,11 +76,7 @@ play_file(snd_pcm_t *snd, FILE *f)
long sampleId, numSamples;
void *sample_buffer;
mp4cb.read = read_callback;
mp4cb.seek = seek_callback;
mp4cb.user_data = f;
infile = mp4ff_open_read(&mp4cb);
infile = MP4Read(fn);
if (! infile) {
fprintf(stderr, "Unable to open stream\n");
return 1;
@ -100,11 +90,13 @@ play_file(snd_pcm_t *snd, FILE *f)
hDecoder = NeAACDecOpen();
config = NeAACDecGetCurrentConfiguration(hDecoder);
config->outputFormat = FAAD_FMT_16BIT;
config->downMatrix = 1;
config->defObjectType = LC;
NeAACDecSetConfiguration(hDecoder, config);
buffer = NULL;
buffer_size = 0;
mp4ff_get_decoder_config(infile, track, &buffer, &buffer_size);
MP4GetTrackESConfiguration(infile, track, &buffer, &buffer_size);
if (NeAACDecInit2(hDecoder, buffer, buffer_size, &samplerate, &channels) < 0) {
fprintf(stderr, "Initializing decoder\n");
@ -125,9 +117,12 @@ play_file(snd_pcm_t *snd, FILE *f)
free(buffer);
}
numSamples = mp4ff_num_samples(infile, track);
DUMP_d(MP4GetTrackMaxSampleSize(infile, track));
for (sampleId = 0; sampleId < numSamples; sampleId++) {
numSamples = MP4GetTrackNumberOfSamples(infile, track);
DUMP_d(numSamples);
for (sampleId = 1; sampleId <= numSamples; sampleId++) {
int rc;
long dur;
unsigned int sample_count;
@ -137,8 +132,7 @@ play_file(snd_pcm_t *snd, FILE *f)
buffer = NULL;
buffer_size = 0;
dur = mp4ff_get_sample_duration(infile, track, sampleId);
rc = mp4ff_read_sample(infile, track, sampleId, &buffer, &buffer_size);
rc = MP4ReadSample(infile, track, sampleId, &buffer, &buffer_size, NULL, NULL, NULL, NULL);
if (rc == 0) {
fprintf(stderr, "Read failed\n");
return 1;
@ -164,28 +158,12 @@ main(int argc, char *argv[])
return 1;
}
if (argc == 1) {
return play_file(snd, stdin);
}
for (i = 1; i < argc; i += 1) {
char *fn = argv[i];
FILE *f = fopen(fn, "r");
if ((fn[0] == '-') && (fn[1] == 0)) {
f = stdin;
fn = "[stdin]";
}
if (! f) {
fprintf(stderr, "Opening %s: %m\n", fn);
continue;
}
printf("%s\n", fn);
play_file(snd, f);
fclose(f);
play_file(snd, fn);
}
return 0;

78
hdjd.c
View File

@ -17,61 +17,53 @@
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
#define DUMP_p(v) DUMPf("%s = %p", #v, v)
// Steel: 0xb102, 0x83, 0x03
// MP3e2: 0x0b105, 0x82,
// 4set: 0xb10c, 0x84, 0x02
int
main(int argc, char **argv)
{
struct libusb_device_handle *handle;
int ret;
struct libusb_device_handle *handle;
int ret;
if (libusb_init(NULL) < 0) {
return 69;
}
if (libusb_init(NULL) < 0) {
return 69;
}
handle = libusb_open_device_with_vid_pid(NULL, 0x06f8, 0xb105); // MP3e2
if (!handle) {
printf("Couldn't find an MP3e2\n");
return 69;
}
handle = libusb_open_device_with_vid_pid(NULL, 0x06f8, 0xb102);
if (!handle) {
printf("Couldn't find a controller\n");
return 69;
}
/* Make Deck A cue button flash. */
{
int transferred;
while (1) {
uint8_t data[80];
int transferred;
int i;
uint8_t cmd[] = { 0x90, 0x3e, 0x7f };
libusb_bulk_transfer(handle, 0x03, cmd, 3, &transferred, 0);
}
if ((ret = libusb_bulk_transfer(handle, 0x83, data, sizeof data, &transferred, 0))) {
break;
}
while (1) {
uint8_t data[80];
int transferred;
int i;
for (i = 0; i < transferred; i += 1) {
printf("%02x ", data[i]);
}
printf("\n");
if ((ret = libusb_bulk_transfer(handle, 0x82,
data, sizeof data,
&transferred, 0))) {
break;
}
// Cram it back out, to turn that light on
if ((ret = libusb_bulk_transfer(handle, 0x04, data, transferred, &transferred, 0))) {
break;
}
for (i = 0; i < transferred; i += 1) {
printf("%02x ", data[i]);
}
printf("\n");
}
/* Cram it right back out */
if (ret < 0) {
printf("ERROR: %s\n", libusb_error_name(ret));
}
if ((ret = libusb_bulk_transfer(handle, 0x03,
data, transferred,
&transferred, 0))) {
break;
}
}
libusb_exit(NULL);
if (ret < 0) {
printf("ERROR: %s\n", libusb_error_name(ret));
}
libusb_exit(NULL);
return 0;
return 0;
}