static void cassette_update(mess_image *cassette) { struct mess_cassetteimg *tag; double cur_time; double new_position; cur_time = timer_get_time(); tag = get_cassimg(cassette); if (cassette_is_motor_on(cassette) && tag->cassette) { new_position = tag->position + (cur_time - tag->position_time); switch(tag->state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(tag->cassette, 0, tag->position, new_position - tag->position, tag->value); break; case CASSETTE_PLAY: cassette_get_sample(tag->cassette, 0, new_position, 0.0, &tag->value); break; } tag->position = new_position; } tag->position_time = cur_time; }
static void cassette_update(device_t *device) { dev_cassette_t *cassette = get_safe_token( device ); double cur_time = device->machine().time().as_double(); if (cassette_is_motor_on(device)) { double new_position = cassette->position + (cur_time - cassette->position_time); switch(cassette->state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(cassette->cassette, 0, cassette->position, new_position - cassette->position, cassette->value); break; case CASSETTE_PLAY: if ( cassette->cassette ) { cassette_get_sample(cassette->cassette, 0, new_position, 0.0, &cassette->value); /* See if reached end of tape */ double length = cassette_get_length(device); if (new_position > length) { cassette->state = (cassette_state)(( cassette->state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = length; } } break; } cassette->position = new_position; } cassette->position_time = cur_time; }
void wavfile_testload(const char *fname) { cassette_image *cassette; FILE *f; long offset; int freq, samples, i; INT32 cassamp; INT16 wavsamp; f = fopen(fname, "rb"); if (!f) return; if (cassette_open(f, &stdio_ioprocs, &wavfile_format, CASSETTE_FLAG_READONLY, &cassette)) return; offset = 44; freq = 44100; samples = 5667062; for (i = 0; i < samples; i++) { cassette_get_sample(cassette, 0, i / (double) freq, 0.0, &cassamp); fseek(f, offset + i * 2, SEEK_SET); fread(&wavsamp, 1, 2, f); assert(cassamp == (((UINT32) wavsamp) << 16)); } cassette_close(cassette); }
void cassette_image_device::update() { double cur_time = device().machine().time().as_double(); if (is_motor_on()) { double new_position = m_position + (cur_time - m_position_time)*m_speed*m_direction; switch(m_state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(m_cassette, m_channel, m_position, new_position - m_position, m_value); break; case CASSETTE_PLAY: if ( m_cassette ) { cassette_get_sample(m_cassette, m_channel, new_position, 0.0, &m_value); /* See if reached end of tape */ double length = get_length(); if (new_position > length) { m_state = (cassette_state)(( m_state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = length; } else if (new_position < 0) { m_state = (cassette_state)(( m_state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = 0; } } break; } m_position = new_position; } m_position_time = cur_time; }