static void tzx_write_raw_data( libspectrum_tape_block *block, libspectrum_byte **buffer, libspectrum_byte **ptr, size_t *length ) { size_t data_length; /* Make room for the ID byte, the metadata and the actual data */ data_length = libspectrum_tape_block_data_length( block ); libspectrum_make_room( buffer, 8 + data_length, ptr, length ); /* Write the ID byte and the metadata */ *(*ptr)++ = LIBSPECTRUM_TAPE_BLOCK_RAW_DATA; libspectrum_write_word( ptr, libspectrum_tape_block_bit_length( block ) ); libspectrum_write_word( ptr, libspectrum_tape_block_pause( block ) ); *(*ptr)++ = libspectrum_tape_block_bits_in_last_byte( block ); tzx_write_bytes( ptr, data_length, 3, libspectrum_tape_block_data( block ) ); }
static libspectrum_dword find_sample_rate( libspectrum_tape *tape ) { libspectrum_tape_iterator iterator; libspectrum_tape_block *block; libspectrum_dword sample_rate = 44100; int found = 0; /* FIXME: If tape has only one block that is a sampled type, just use it's rate and if it RLE, we should just zlib and write */ for( block = libspectrum_tape_iterator_init( &iterator, tape ); block; block = libspectrum_tape_iterator_next( &iterator ) ) { switch( libspectrum_tape_block_type( block ) ) { case LIBSPECTRUM_TAPE_BLOCK_RAW_DATA: case LIBSPECTRUM_TAPE_BLOCK_RLE_PULSE: { libspectrum_dword block_rate = 3500000 / libspectrum_tape_block_bit_length( block ); if( found ) { if( block_rate != sample_rate ) { libspectrum_print_error( LIBSPECTRUM_ERROR_WARNING, "find_sample_rate: converting tape with mixed sample rates; conversion may well not work" ); } } sample_rate = block_rate; found = 1; } break; case LIBSPECTRUM_TAPE_BLOCK_ROM: case LIBSPECTRUM_TAPE_BLOCK_TURBO: case LIBSPECTRUM_TAPE_BLOCK_PURE_TONE: case LIBSPECTRUM_TAPE_BLOCK_PULSES: case LIBSPECTRUM_TAPE_BLOCK_PURE_DATA: case LIBSPECTRUM_TAPE_BLOCK_GENERALISED_DATA: case LIBSPECTRUM_TAPE_BLOCK_PAUSE: case LIBSPECTRUM_TAPE_BLOCK_GROUP_START: case LIBSPECTRUM_TAPE_BLOCK_GROUP_END: case LIBSPECTRUM_TAPE_BLOCK_JUMP: case LIBSPECTRUM_TAPE_BLOCK_LOOP_START: case LIBSPECTRUM_TAPE_BLOCK_LOOP_END: case LIBSPECTRUM_TAPE_BLOCK_SELECT: case LIBSPECTRUM_TAPE_BLOCK_STOP48: case LIBSPECTRUM_TAPE_BLOCK_COMMENT: case LIBSPECTRUM_TAPE_BLOCK_MESSAGE: case LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO: case LIBSPECTRUM_TAPE_BLOCK_HARDWARE: case LIBSPECTRUM_TAPE_BLOCK_CUSTOM: case LIBSPECTRUM_TAPE_BLOCK_CONCAT: break; default: libspectrum_print_error( LIBSPECTRUM_ERROR_LOGIC, "libspectrum_csw_write: unknown block type 0x%02x", libspectrum_tape_block_type( block ) ); } } return sample_rate; }