diff --git a/Makefile b/Makefile index 9d6aeef..d4ed98f 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/aac123.c b/aac123.c index f0522d3..1da1b01 100644 --- a/aac123.c +++ b/aac123.c @@ -3,7 +3,7 @@ #include #include -#include +#include /* 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; diff --git a/hdjd.c b/hdjd.c index 179834d..9ac33d9 100644 --- a/hdjd.c +++ b/hdjd.c @@ -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; }