static void fill_ring_buffer(void *userData){ paTestData *data = (paTestData*)userData; while (btstack_ring_buffer_bytes_free(&ring_buffer) > BYTES_PER_FRAME){ uint8_t write_data[BYTES_PER_FRAME]; *(int16_t*)&write_data[0] = data->sine[data->left_phase]; *(int16_t*)&write_data[2] = data->sine[data->right_phase]; btstack_ring_buffer_write(&ring_buffer, write_data, BYTES_PER_FRAME); write_wav_data((int16_t*)write_data, 1, NUM_CHANNELS, SAMPLE_RATE); data->left_phase += 1; if (data->left_phase >= TABLE_SIZE){ data->left_phase -= TABLE_SIZE; } data->right_phase += 2; /* higher pitch so we can distinguish left and right. */ if (data->right_phase >= TABLE_SIZE){ data->right_phase -= TABLE_SIZE; } } }
int main(int argc, char *argv[]) { int i, j; int n; int channels; long freq; long total_size; long block, num_block; FILE *fp_adp; FILE *fp_wav; XA_BLOCK xa_block; INT16 pcm_l[28]; INT16 pcm_r[28]; fprintf(stderr, "adp2wav version 0.22 Copyright (C) 1997 Nobuyuki NISHIZAWA\n"); if (argc != 3) { fprintf(stderr, "Usage: adp2wav <input.adp> <output.wav>\n"); return 255; } fp_adp = fopen(argv[1], "rb"); fp_wav = fopen(argv[2], "wb"); if (fp_adp == NULL || fp_wav == NULL) { fprintf(stderr, "Error: cannot open file.\n"); return 1; } num_block = read_aiff_header(fp_adp, &freq, &channels); //fseek(fp_adp, 0x36, SEEK_SET); fseek(fp_wav, 0x2c, SEEK_SET); total_size = 0; pcm_l[26] = 0; pcm_l[27] = 0; pcm_r[26] = 0; pcm_r[27] = 0; block = 0; while (fread(&xa_block, sizeof(xa_block), 1, fp_adp) == 1 && block < num_block) { for (i = 0; i < 18; i++) { if (channels == 2) { for (j = 0; j < 8; j += 2) { n = decode_adpcm(&xa_block.adpcm[i], pcm_l, j, pcm_l[27], pcm_l[26]); decode_adpcm(&xa_block.adpcm[i], pcm_r, j + 1, pcm_r[27], pcm_r[26]); total_size += write_wav_data(fp_wav, pcm_l, pcm_r, n); } } else { for (j = 0; j < 8; j++) { n = decode_adpcm(&xa_block.adpcm[i], pcm_l, j, pcm_l[27], pcm_l[26]); total_size += write_wav_data(fp_wav, pcm_l, NULL, n); } } } } write_wav_header(fp_wav, freq, channels, total_size); fclose(fp_wav); fclose(fp_adp); return 0; }