Example #1
0
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 ) );
}
Example #2
0
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;
}