netmd_error netmd_secure_recv_track(netmd_dev_handle *dev, uint16_t track, FILE* file) { unsigned char cmdhdr[] = {0x00, 0x10, 0x01}; unsigned char cmd[sizeof(cmdhdr) + sizeof(track)] = { 0 }; unsigned char *buf; unsigned char encoding; unsigned char channel; char name[257] = { 0 }; unsigned char codec; uint32_t length; uint16_t track_id; netmd_response response; netmd_error error; buf = cmd; memcpy(buf, cmdhdr, sizeof(cmdhdr)); buf += sizeof(cmdhdr); netmd_copy_word_to_buffer(&buf, track, 0); track_id = (track - 1U) & 0xffff;; netmd_request_track_bitrate(dev, track_id, &encoding, &channel); if (encoding == NETMD_ENCODING_SP) { netmd_request_title(dev, track_id, name, sizeof(name) - 1); } else { } netmd_send_secure_msg(dev, 0x30, cmd, sizeof(cmd)); error = netmd_recv_secure_msg(dev, 0x30, &response, NETMD_STATUS_INTERIM); netmd_check_response_bulk(&response, cmdhdr, sizeof(cmdhdr), &error); netmd_check_response_word(&response, track, &error); codec = netmd_read(&response); length = netmd_read_doubleword(&response); if (encoding == NETMD_ENCODING_SP) { netmd_write_aea_header(name, codec, channel, file); } else { netmd_write_wav_header(codec, length, file); } if (error == NETMD_NO_ERROR) { error = netmd_secure_real_recv_track(dev, length, file, 0x10000); } if (error == NETMD_NO_ERROR) { error = netmd_recv_secure_msg(dev, 0x30, &response, NETMD_STATUS_ACCEPTED); netmd_check_response_bulk(&response, cmdhdr, sizeof(cmdhdr), &error); netmd_read_response_bulk(&response, NULL, 2, &error); netmd_check_response_word(&response, 0, &error); } return error; }
void print_current_track_info(netmd_dev_handle* devh) { uint16_t track; char buffer[256]; netmd_time time; /* TODO: error checking */ netmd_get_position(devh, &time); netmd_get_track(devh, &track); netmd_request_title(devh, track, buffer, 256); printf("Current track: %s \n", buffer); printf("Current playback position: "); print_time(&time); printf("\n"); }
void print_disc_info(netmd_dev_handle* devh, minidisc* md) { uint8_t i = 0; int size = 1; uint8_t g, group = 0, lastgroup = 0; unsigned char bitrate_id; unsigned char flags; unsigned char channel; char *name, buffer[256]; struct netmd_track time; struct netmd_pair const *trprot, *bitrate; trprot = bitrate = 0; for(i = 0; size >= 0; i++) { size = netmd_request_title(devh, i, buffer, 256); if(size < 0) { break; } /* Figure out which group this track is in */ for( group = 0, g = 1; g < md->group_count; g++ ) { if( (md->groups[g].start <= i+1U) && (md->groups[g].finish >= i+1U )) { group = g; break; } } /* Different to the last group? */ if( group != lastgroup ) { lastgroup = group; if( group ) /* Group 0 is 'no group' */ { printf("Group: %s\n", md->groups[group].name); } } /* Indent tracks which are in a group */ if( group ) { printf(" "); } netmd_request_track_time(devh, i, &time); netmd_request_track_flags(devh, i, &flags); netmd_request_track_bitrate(devh, i, &bitrate_id, &channel); trprot = find_pair(flags, trprot_settings); bitrate = find_pair(bitrate_id, bitrates); /* Skip 'LP:' prefix... the codec type shows up in the list anyway*/ if( strncmp( buffer, "LP:", 3 )) { name = buffer; } else { name = buffer + 3; } printf("Track %2i: %-6s %6s - %02i:%02i:%02i - %s\n", i, trprot->name, bitrate->name, time.minute, time.second, time.tenth, name); } /* XXX - This needs a rethink with the above method */ /* groups may not have tracks, print the rest. */ printf("\n--Empty Groups--\n"); for(group=1; group < md->group_count; group++) { if(md->groups[group].start == 0 && md->groups[group].finish == 0) { printf("Group: %s\n", md->groups[group].name); } } printf("\n\n"); }