From 092c340a2062fa98b7387fc5fd63578ddae7d0b6 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 15 Jul 2020 19:40:55 -0400 Subject: [1/4] Remove SH support and all archos targets This removes all code specific to SH targets Change-Id: I7980523785d2596e65c06430f4638eec74a06061 --- apps/mpeg.c | 1079 ----------------------------------------------------------- 1 file changed, 1079 deletions(-) (limited to 'apps/mpeg.c') diff --git a/apps/mpeg.c b/apps/mpeg.c index d3e0e5c137..e04c227cb1 100644 --- a/apps/mpeg.c +++ b/apps/mpeg.c @@ -46,7 +46,6 @@ #include "settings.h" #ifndef SIMULATOR #include "i2c.h" -#include "mas35xx.h" #include "system.h" #include "usb.h" #include "file.h" @@ -81,14 +80,6 @@ extern unsigned long mas_version_code; #endif -#if CONFIG_CODEC == MAS3587F -extern enum /* from mp3_playback.c */ -{ - MPEG_DECODER, - MPEG_ENCODER -} mpeg_mode; -#endif /* CONFIG_CODEC == MAS3587F */ - #define MPEG_PLAY 1 #define MPEG_STOP 2 #define MPEG_PAUSE 3 @@ -184,61 +175,6 @@ struct audio_resume_info unsigned long offset; }; -#if CONFIG_CODEC == MAS3587F -static char recording_filename[MAX_PATH]; /* argument to thread */ -static char delayed_filename[MAX_PATH]; /* internal copy of above */ - -static char xing_buffer[MAX_XING_HEADER_SIZE]; - -static bool init_recording_done; -static bool init_playback_done; -static bool prerecording; /* True if prerecording is enabled */ -static bool is_prerecording; /* True if we are prerecording */ -static bool is_recording; /* We are recording */ - -static enum { - NOT_SAVING = 0, /* reasons to save data, sorted by importance */ - BUFFER_FULL, - NEW_FILE, - STOP_RECORDING -} saving_status; - -static int rec_frequency_index; /* For create_xing_header() calls */ -static int rec_version_index; /* For create_xing_header() calls */ - -struct prerecord_info { - int mempos; - unsigned long framecount; -}; - -static struct prerecord_info prerecord_buffer[MPEG_MAX_PRERECORD_SECONDS]; -static int prerecord_index; /* Current index in the prerecord buffer */ -static int prerecording_max_seconds; /* Max number of seconds to store */ -static int prerecord_count; /* Number of seconds in the prerecord buffer */ -static int prerecord_timeout; /* The tick count of the next prerecord data - store */ - -static unsigned long record_start_time; /* Value of current_tick when recording - was started */ -static unsigned long pause_start_time; /* Value of current_tick when pause was - started */ -static unsigned long last_rec_time; -static unsigned long num_rec_bytes; -static unsigned long last_rec_bytes; -static unsigned long frame_count_start; -static unsigned long frame_count_end; -static unsigned long saved_header = 0; - -/* Shadow MAS registers */ -unsigned long shadow_encoder_control = 0; -#endif /* CONFIG_CODEC == MAS3587F */ - -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -unsigned long shadow_io_control_main = 0; -unsigned long shadow_soft_mute = 0; -unsigned shadow_codec_reg0; -#endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ - #ifdef HAVE_RECORDING static const unsigned char empty_id3_header[] = { @@ -253,18 +189,6 @@ static int get_playable_space(void); static int get_unswapped_space(void); #endif /* !SIMULATOR */ -#if (CONFIG_CODEC == MAS3587F) && !defined(SIMULATOR) -static void init_recording(void); -static void prepend_header(void); -static void update_header(void); -static void start_prerecording(void); -static void start_recording(void); -static void stop_recording(void); -static int get_unsaved_space(void); -static void pause_recording(void); -static void resume_recording(void); -#endif /* (CONFIG_CODEC == MAS3587F) && !defined(SIMULATOR) */ - static void audio_reset_buffer_noalloc(void* buf, size_t bufsize); static void audio_reset_buffer(void); @@ -540,12 +464,6 @@ static int shrink_callback(int handle, unsigned hints, void* start, size_t old_s size_t wanted_size = (hints & BUFLIB_SHRINK_SIZE_MASK); ssize_t size = (ssize_t)old_size - wanted_size; -#if !defined(SIMULATOR) && (CONFIG_CODEC == MAS3587F) - /* FIXME: Cannot give the buffer during recording yet */ - if (is_recording) - return BUFLIB_CB_CANNOT_SHRINK; -#endif - /* keep at least 256K for the buffering */ if ((size - extradata_size) < AUDIO_BUFFER_RESERVE) { @@ -677,9 +595,6 @@ void audio_get_debugdata(struct audio_debug *dbgdata) dbgdata->last_dma_chunk_size = last_dma_chunk_size; -#if CONFIG_CPU == SH7034 - dbgdata->dma_on = (SCR0 & 0x80) != 0; -#endif dbgdata->playing = playing; dbgdata->play_pending = play_pending; dbgdata->is_playing = is_playing; @@ -758,108 +673,6 @@ static int get_unswapped_space(void) return space; } -#if CONFIG_CODEC == MAS3587F -static int get_unsaved_space(void) -{ - int space = audiobuf_write - audiobuf_read; - if (space < 0) - space += audiobuflen; - return space; -} - -static void drain_dma_buffer(void) -{ - while (PBDRH & 0x40) - { - xor_b(0x08, &PADRH); - - while (PBDRH & 0x80); - - xor_b(0x08, &PADRH); - - while (!(PBDRH & 0x80)); - } -} - -#ifdef DEBUG -static long timing_info_index = 0; -static long timing_info[1024]; -#endif /* DEBUG */ - -void rec_tick (void) __attribute__ ((section (".icode"))); -void rec_tick(void) -{ - int i; - int delay; - char data; - - if(is_recording && (PBDRH & 0x40)) - { -#ifdef DEBUG - timing_info[timing_info_index++] = current_tick; - TCNT2 = 0; -#endif /* DEBUG */ - /* Note: Although this loop is run in interrupt context, further - * optimisation will do no good. The MAS would then deliver bad - * frames occasionally, as observed in extended experiments. */ - i = 0; - while (PBDRH & 0x40) /* We try to read as long as EOD is high */ - { - xor_b(0x08, &PADRH); /* Set PR active, independent of polarity */ - - delay = 100; - while (PBDRH & 0x80) /* Wait until /RTW becomes active */ - { - if (--delay <= 0) /* Bail out if we have to wait too long */ - { /* i.e. the MAS doesn't want to talk to us */ - xor_b(0x08, &PADRH); /* Set PR inactive */ - goto transfer_end; /* and get out of here */ - } - } - - data = *(unsigned char *)0x04000000; /* read data byte */ - - xor_b(0x08, &PADRH); /* Set PR inactive */ - - mpeg_audiobuf[audiobuf_write++] = data; - - if (audiobuf_write >= audiobuflen) - audiobuf_write = 0; - - i++; - } - transfer_end: - -#ifdef DEBUG - timing_info[timing_info_index++] = TCNT2 + (i << 16); - timing_info_index &= 0x3ff; -#endif /* DEBUG */ - - num_rec_bytes += i; - - if(is_prerecording) - { - if(TIME_AFTER(current_tick, prerecord_timeout)) - { - prerecord_timeout = current_tick + HZ; - queue_post(&mpeg_queue, MPEG_PRERECORDING_TICK, 0); - } - } - else - { - /* Signal to save the data if we are running out of buffer - space */ - if (audiobuflen - get_unsaved_space() < MPEG_RECORDING_LOW_WATER - && saving_status == NOT_SAVING) - { - saving_status = BUFFER_FULL; - queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0); - } - } - } -} -#endif /* CONFIG_CODEC == MAS3587F */ - void playback_tick(void) { struct trackdata *ptd = get_trackdata(0); @@ -1158,11 +971,6 @@ static void track_change(void) { DEBUGF("Track change\n"); -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - /* Reset the AVC */ - sound_set_avc(-1); -#endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ - if (num_tracks_in_memory() > 0) { remove_current_tag(); @@ -1293,13 +1101,6 @@ static void mpeg_thread(void) int amount_to_read; int t1, t2; unsigned long start_elapsed, start_offset; -#if CONFIG_CODEC == MAS3587F - int amount_to_save; - int save_endpos = 0; - int rc; - int level; - long offset; -#endif /* CONFIG_CODEC == MAS3587F */ is_playing = false; play_pending = false; @@ -1308,10 +1109,6 @@ static void mpeg_thread(void) while(1) { -#if CONFIG_CODEC == MAS3587F - if(mpeg_mode == MPEG_DECODER) - { -#endif /* CONFIG_CODEC == MAS3587F */ yield(); /* Swap if necessary, and don't block on the queue_wait() */ @@ -1836,321 +1633,11 @@ static void mpeg_thread(void) break; #endif /* !USB_NONE */ -#if CONFIG_CODEC == MAS3587F - case MPEG_INIT_RECORDING: - init_recording(); - init_recording_done = true; - break; -#endif /* CONFIG_CODEC == MAS3587F */ - case SYS_TIMEOUT: if (playing) playlist_update_resume_info(audio_current_track()); break; } -#if CONFIG_CODEC == MAS3587F - } - else - { - queue_wait(&mpeg_queue, &ev); - switch(ev.id) - { - case MPEG_RECORD: - if (is_prerecording) - { - int startpos; - - /* Go back prerecord_count seconds in the buffer */ - startpos = prerecord_index - prerecord_count; - if(startpos < 0) - startpos += prerecording_max_seconds; - - /* Read the position data from the prerecord buffer */ - frame_count_start = prerecord_buffer[startpos].framecount; - startpos = prerecord_buffer[startpos].mempos; - - DEBUGF("Start looking at address %x (%x)\n", - mpeg_audiobuf+startpos, startpos); - - saved_header = mpeg_get_last_header(); - - mem_find_next_frame(startpos, &offset, 1800, - saved_header, mpeg_audiobuf, - audiobuflen); - - audiobuf_read = startpos + offset; - if(audiobuf_read >= audiobuflen) - audiobuf_read -= audiobuflen; - - DEBUGF("New audiobuf_read address: %x (%x)\n", - mpeg_audiobuf+audiobuf_read, audiobuf_read); - - level = disable_irq_save(); - num_rec_bytes = get_unsaved_space(); - restore_irq(level); - } - else - { - frame_count_start = 0; - num_rec_bytes = 0; - audiobuf_read = MPEG_RESERVED_HEADER_SPACE; - audiobuf_write = MPEG_RESERVED_HEADER_SPACE; - } - - prepend_header(); - DEBUGF("Recording...\n"); - start_recording(); - - /* Wait until at least one frame is encoded and get the - frame header, for later use by the Xing header - generation */ - sleep(HZ/5); - saved_header = mpeg_get_last_header(); - - /* delayed until buffer is saved, don't open yet */ - strcpy(delayed_filename, recording_filename); - mpeg_file = -1; - - break; - - case MPEG_STOP: - DEBUGF("MPEG_STOP\n"); - - stop_recording(); - - /* Save the remaining data in the buffer */ - save_endpos = audiobuf_write; - saving_status = STOP_RECORDING; - queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0); - break; - - case MPEG_STOP_DONE: - DEBUGF("MPEG_STOP_DONE\n"); - - if (mpeg_file >= 0) - close(mpeg_file); - mpeg_file = -1; - - update_header(); -#ifdef DEBUG1 - { - int i; - for(i = 0;i < 512;i++) - { - DEBUGF("%d - %d us (%d bytes)\n", - timing_info[i*2], - (timing_info[i*2+1] & 0xffff) * - 10000 / 13824, - timing_info[i*2+1] >> 16); - } - } -#endif /* DEBUG1 */ - - if (prerecording) - { - start_prerecording(); - } - mpeg_stop_done = true; - break; - - case MPEG_NEW_FILE: - /* Bail out when a more important save is happening */ - if (saving_status > NEW_FILE) - break; - - /* Make sure we have at least one complete frame - in the buffer. If we haven't recorded a single - frame within 200ms, the MAS is probably not recording - anything, and we bail out. */ - amount_to_save = get_unsaved_space(); - if (amount_to_save < 1800) - { - sleep(HZ/5); - amount_to_save = get_unsaved_space(); - } - - mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_FRAME_COUNT, - &frame_count_end, 1); - - last_rec_time = current_tick - record_start_time; - record_start_time = current_tick; - if (paused) - pause_start_time = record_start_time; - - /* capture all values at one point */ - level = disable_irq_save(); - save_endpos = audiobuf_write; - last_rec_bytes = num_rec_bytes; - num_rec_bytes = 0; - restore_irq(level); - - if (amount_to_save >= 1800) - { - /* Now find a frame boundary to split at */ - save_endpos -= 1800; - if (save_endpos < 0) - save_endpos += audiobuflen; - - rc = mem_find_next_frame(save_endpos, &offset, 1800, - saved_header, mpeg_audiobuf, - audiobuflen); - if (!rc) /* No header found, save whole buffer */ - offset = 1800; - - save_endpos += offset; - if (save_endpos >= audiobuflen) - save_endpos -= audiobuflen; - - last_rec_bytes += offset - 1800; - level = disable_irq_save(); - num_rec_bytes += 1800 - offset; - restore_irq(level); - } - - saving_status = NEW_FILE; - queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0); - break; - - case MPEG_SAVE_DATA: - if (saving_status == BUFFER_FULL) - save_endpos = audiobuf_write; - - if (mpeg_file < 0) /* delayed file open */ - { - mpeg_file = open(delayed_filename, O_WRONLY|O_CREAT, 0666); - - if (mpeg_file < 0) - panicf("recfile: %d", mpeg_file); - } - - amount_to_save = save_endpos - audiobuf_read; - if (amount_to_save < 0) - amount_to_save += audiobuflen; - - amount_to_save = MIN(amount_to_save, - audiobuflen - audiobuf_read); -#if (CONFIG_STORAGE & STORAGE_MMC) - /* MMC is slow, so don't save too large chunks at once */ - amount_to_save = MIN(0x40000, amount_to_save); -#elif MEMORYSIZE == 8 - amount_to_save = MIN(0x100000, amount_to_save); -#endif - rc = write(mpeg_file, mpeg_audiobuf + audiobuf_read, - amount_to_save); - if (rc < 0) - { - if (errno == ENOSPC) - { - mpeg_errno = AUDIOERR_DISK_FULL; - stop_recording(); - queue_post(&mpeg_queue, MPEG_STOP_DONE, 0); - /* will close the file */ - break; - } - else - panicf("rec wrt: %d", rc); - } - - audiobuf_read += amount_to_save; - if (audiobuf_read >= audiobuflen) - audiobuf_read = 0; - - if (audiobuf_read == save_endpos) /* all saved */ - { - switch (saving_status) - { - case BUFFER_FULL: - rc = fsync(mpeg_file); - if (rc < 0) - panicf("rec fls: %d", rc); - storage_sleep(); - break; - - case NEW_FILE: - /* Close the current file */ - rc = close(mpeg_file); - if (rc < 0) - panicf("rec cls: %d", rc); - mpeg_file = -1; - update_header(); - storage_sleep(); - - /* copy new filename */ - strcpy(delayed_filename, recording_filename); - prepend_header(); - frame_count_start = frame_count_end; - break; - - case STOP_RECORDING: - queue_post(&mpeg_queue, MPEG_STOP_DONE, 0); - /* will close the file */ - break; - - default: - break; - } - saving_status = NOT_SAVING; - } - else /* tell ourselves to save the next chunk */ - queue_post(&mpeg_queue, MPEG_SAVE_DATA, 0); - - break; - - case MPEG_PRERECORDING_TICK: - if(!is_prerecording) - break; - - /* Store the write pointer every second */ - prerecord_buffer[prerecord_index].mempos = audiobuf_write; - mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_FRAME_COUNT, - &prerecord_buffer[prerecord_index].framecount, 1); - - /* Wrap if necessary */ - if(++prerecord_index == prerecording_max_seconds) - prerecord_index = 0; - - /* Update the number of seconds recorded */ - if(prerecord_count < prerecording_max_seconds) - prerecord_count++; - break; - - case MPEG_INIT_PLAYBACK: - /* Stop the prerecording */ - stop_recording(); - reset_mp3_buffer(); - mp3_play_init(); - init_playback_done = true; - break; - - case MPEG_PAUSE_RECORDING: - pause_recording(); - break; - - case MPEG_RESUME_RECORDING: - resume_recording(); - break; - - case SYS_USB_CONNECTED: - /* We can safely go to USB mode if no recording - is taking place */ - if((!is_recording || is_prerecording) && mpeg_stop_done) - { - /* Even if we aren't recording, we still call this - function, to put the MAS in monitoring mode, - to save power. */ - stop_recording(); - - /* Tell the USB thread that we are safe */ - DEBUGF("mpeg_thread got SYS_USB_CONNECTED\n"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); - - /* Wait until the USB cable is extracted again */ - usb_wait_for_disconnect(&mpeg_queue); - } - break; - } - } -#endif /* CONFIG_CODEC == MAS3587F */ } } #endif /* !SIMULATOR */ @@ -2195,557 +1682,6 @@ struct mp3entry* audio_next_track(void) #endif /* !SIMULATOR */ } -#if CONFIG_CODEC == MAS3587F -#ifndef SIMULATOR -void audio_init_playback(void) -{ - init_playback_done = false; - queue_post(&mpeg_queue, MPEG_INIT_PLAYBACK, 0); - - while(!init_playback_done) - sleep(1); -} - - -/**************************************************************************** - * Recording functions - ***************************************************************************/ -void audio_init_recording(void) -{ - init_recording_done = false; - queue_post(&mpeg_queue, MPEG_INIT_RECORDING, 0); - - while(!init_recording_done) - sleep(1); -} - -static void init_recording(void) -{ - unsigned long val; - int rc; - - /* Disable IRQ6 */ - IPRB &= 0xff0f; - - stop_playing(); - is_playing = false; - paused = false; - - /* Init the recording variables */ - is_recording = false; - is_prerecording = false; - - /* Have to grab the audio buffer in case voice had it */ - audio_reset_buffer(); - - mpeg_stop_done = true; - - mas_reset(); - - /* Enable the audio CODEC and the DSP core, max analog voltage range */ - rc = mas_direct_config_write(MAS_CONTROL, 0x8c00); - if(rc < 0) - panicf("mas_ctrl_w: %d", rc); - - /* Stop the current application */ - val = 0; - mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1); - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1); - } while(val); - - /* Perform black magic as described by the data sheet */ - if((mas_version_code & 0x0fff) == 0x0102) - { - DEBUGF("Performing MAS black magic for B2 version\n"); - mas_writereg(0xa3, 0x98); - mas_writereg(0x94, 0xfffff); - val = 0; - mas_writemem(MAS_BANK_D1, 0, &val, 1); - mas_writereg(0xa3, 0x90); - } - - /* Enable A/D Converters */ - shadow_codec_reg0 = 0xcccd; - mas_codec_writereg(0x0, shadow_codec_reg0); - - /* Copy left channel to right (mono mode) */ - mas_codec_writereg(8, 0x8000); - - /* ADC scale 0%, DSP scale 100% - We use the DSP output for monitoring, because it works with all - sources including S/PDIF */ - mas_codec_writereg(6, 0x0000); - mas_codec_writereg(7, 0x4000); - - /* No mute */ - shadow_soft_mute = 0; - mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1); - -#ifdef HAVE_SPDIF_OUT - val = 0x09; /* Disable SDO and SDI, low impedance S/PDIF outputs */ -#else - val = 0x2d; /* Disable SDO and SDI, disable S/PDIF output */ -#endif - mas_writemem(MAS_BANK_D0, MAS_D0_INTERFACE_CONTROL, &val, 1); - - /* Set Demand mode, monitoring OFF and validate all settings */ - shadow_io_control_main = 0x125; - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); - - /* Start the encoder application */ - val = 0x40; - mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1); - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1); - } while(!(val & 0x40)); - - /* We have started the recording application with monitoring OFF. - This is because we want to record at least one frame to fill the DMA - buffer, because the silly MAS will not negate EOD until at least one - DMA transfer has taken place. - Now let's wait for some data to be encoded. */ - sleep(HZ/5); - - /* Now set it to Monitoring mode as default, saves power */ - shadow_io_control_main = 0x525; - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); - - /* Wait until the DSP has accepted the settings */ - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1); - } while(val & 1); - - drain_dma_buffer(); - mpeg_mode = MPEG_ENCODER; - - DEBUGF("MAS Recording application started\n"); - - /* At this point, all settings are the reset MAS defaults, next thing is to - call mpeg_set_recording_options(). */ -} - -void audio_record(const char *filename) -{ - mpeg_errno = 0; - - strlcpy(recording_filename, filename, MAX_PATH); - - queue_post(&mpeg_queue, MPEG_RECORD, 0); -} - -void audio_pause_recording(void) -{ - queue_post(&mpeg_queue, MPEG_PAUSE_RECORDING, 0); -} - -void audio_resume_recording(void) -{ - queue_post(&mpeg_queue, MPEG_RESUME_RECORDING, 0); -} - -static void prepend_header(void) -{ - int startpos; - unsigned i; - - /* Make room for header */ - audiobuf_read -= MPEG_RESERVED_HEADER_SPACE; - if(audiobuf_read < 0) - { - /* Clear the bottom half */ - memset(mpeg_audiobuf, 0, audiobuf_read + MPEG_RESERVED_HEADER_SPACE); - - /* And the top half */ - audiobuf_read += audiobuflen; - memset(mpeg_audiobuf + audiobuf_read, 0, audiobuflen - audiobuf_read); - } - else - { - memset(mpeg_audiobuf + audiobuf_read, 0, MPEG_RESERVED_HEADER_SPACE); - } - /* Copy the empty ID3 header */ - startpos = audiobuf_read; - for(i = 0; i < sizeof(empty_id3_header); i++) - { - mpeg_audiobuf[startpos++] = empty_id3_header[i]; - if(startpos == audiobuflen) - startpos = 0; - } -} - -static void update_header(void) -{ - int fd, framelen; - unsigned long frames; - - if (last_rec_bytes > 0) - { - /* Create the Xing header */ - fd = open(delayed_filename, O_RDWR); - if (fd < 0) - panicf("rec upd: %d (%s)", fd, recording_filename); - - frames = frame_count_end - frame_count_start; - /* If the number of recorded frames has reached 0x7ffff, - we can no longer trust it */ - if (frame_count_end == 0x7ffff) - frames = 0; - - /* saved_header is saved right before stopping the MAS */ - framelen = create_xing_header(fd, 0, last_rec_bytes, xing_buffer, - frames, last_rec_time * (1000/HZ), - saved_header, NULL, false, - mpeg_audiobuf, audiobuflen); - - lseek(fd, MPEG_RESERVED_HEADER_SPACE - framelen, SEEK_SET); - write(fd, xing_buffer, framelen); - close(fd); - } -} - -static void start_prerecording(void) -{ - unsigned long val; - - DEBUGF("Starting prerecording\n"); - - prerecord_index = 0; - prerecord_count = 0; - prerecord_timeout = current_tick + HZ; - memset(prerecord_buffer, 0, sizeof(prerecord_buffer)); - reset_mp3_buffer(); - - is_prerecording = true; - - /* Stop monitoring and start the encoder */ - shadow_io_control_main &= ~(1 << 10); - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); - DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main); - - /* Wait until the DSP has accepted the settings */ - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1); - } while(val & 1); - - is_recording = true; - saving_status = NOT_SAVING; - - demand_irq_enable(true); -} - -static void start_recording(void) -{ - unsigned long val; - - if(is_prerecording) - { - /* This will make the IRQ handler start recording - for real, i.e send MPEG_SAVE_DATA messages when - the buffer is full */ - is_prerecording = false; - } - else - { - /* If prerecording is off, we need to stop the monitoring - and start the encoder */ - shadow_io_control_main &= ~(1 << 10); - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); - DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main); - - /* Wait until the DSP has accepted the settings */ - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1); - } while(val & 1); - } - - is_recording = true; - saving_status = NOT_SAVING; - paused = false; - - /* Store the current time */ - if(prerecording) - record_start_time = current_tick - prerecord_count * HZ; - else - record_start_time = current_tick; - - pause_start_time = 0; - - demand_irq_enable(true); -} - -static void pause_recording(void) -{ - pause_start_time = current_tick; - - /* Set the pause bit */ - shadow_soft_mute |= 2; - mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1); - - paused = true; -} - -static void resume_recording(void) -{ - paused = false; - - /* Clear the pause bit */ - shadow_soft_mute &= ~2; - mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1); - - /* Compensate for the time we have been paused */ - if(pause_start_time) - { - record_start_time = - current_tick - (pause_start_time - record_start_time); - pause_start_time = 0; - } -} - -static void stop_recording(void) -{ - unsigned long val; - - /* Let it finish the last frame */ - if(!paused) - pause_recording(); - sleep(HZ/5); - - demand_irq_enable(false); - - is_recording = false; - is_prerecording = false; - - last_rec_bytes = num_rec_bytes; - mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_FRAME_COUNT, &frame_count_end, 1); - last_rec_time = current_tick - record_start_time; - - /* Start monitoring */ - shadow_io_control_main |= (1 << 10); - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); - DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main); - - /* Wait until the DSP has accepted the settings */ - do - { - mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1); - } while(val & 1); - - resume_recording(); -} - -void audio_set_recording_options(struct audio_recording_options *options) -{ - bool is_mpeg1; - - is_mpeg1 = (options->rec_frequency < 3); - - rec_version_index = is_mpeg1?3:2; - rec_frequency_index = options->rec_frequency % 3; - - shadow_encoder_control = (options->rec_quality << 17) | - (rec_frequency_index << 10) | - ((is_mpeg1?1:0) << 9) | - (((options->rec_channels * 2 + 1) & 3) << 6) | - (1 << 5) /* MS-stereo */ | - (1 << 2) /* Is an original */; - mas_writemem(MAS_BANK_D0, MAS_D0_ENCODER_CONTROL, &shadow_encoder_control,1); - - DEBUGF("mas_writemem(MAS_BANK_D0, ENCODER_CONTROL, %x)\n", shadow_encoder_control); - -#if CONFIG_TUNER & S1A0903X01 - /* Store the (unpitched) MAS PLL frequency. Used for avoiding FM - interference with the Samsung tuner. */ - if (rec_frequency_index) - mas_store_pllfreq(24576000); - else - mas_store_pllfreq(22579000); -#endif - - shadow_soft_mute = options->rec_editable?4:0; - mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute,1); - - DEBUGF("mas_writemem(MAS_BANK_D0, SOFT_MUTE, %x)\n", shadow_soft_mute); - - shadow_io_control_main = ((1 << 10) | /* Monitoring ON */ - ((options->rec_source < 2)?1:2) << 8) | /* Input select */ - (1 << 5) | /* SDO strobe invert */ - ((is_mpeg1?0:1) << 3) | - (1 << 2) | /* Inverted SIBC clock signal */ - 1; /* Validate */ - mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main,1); - - DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main); - - if(options->rec_source == AUDIO_SRC_MIC) - { - /* Copy left channel to right (mono mode) */ - mas_codec_writereg(8, 0x8000); - } - else - { - /* Stereo input mode */ - mas_codec_writereg(8, 0); - } - - prerecording_max_seconds = options->rec_prerecord_time; - if(prerecording_max_seconds) - { - prerecording = true; - start_prerecording(); - } - else - { - prerecording = false; - is_prerecording = false; - is_recording = false; - } -} - -/* If use_mic is true, the left gain is used */ -void audio_set_recording_gain(int left, int right, int type) -{ - /* Enable both left and right A/D */ - shadow_codec_reg0 = (left << 12) | - (right << 8) | - (left << 4) | - (type==AUDIO_GAIN_MIC?0x0008:0) | /* Connect left A/D to mic */ - 0x0007; - mas_codec_writereg(0x0, shadow_codec_reg0); -} - -/* try to make some kind of beep, also in recording mode */ -void audio_beep(int duration) -{ - long starttick = current_tick; - do - { /* toggle bit 0 of codec register 0, toggling the DAC off & on. - * While this is still audible even without an external signal, - * it doesn't affect the (pre-)recording. */ - mas_codec_writereg(0, shadow_codec_reg0 ^ 1); - mas_codec_writereg(0, shadow_codec_reg0); - yield(); - } - while (current_tick - starttick < duration); -} - -void audio_new_file(const char *filename) -{ - mpeg_errno = 0; - - strlcpy(recording_filename, filename, MAX_PATH); - - queue_post(&mpeg_queue, MPEG_NEW_FILE, 0); -} - -unsigned long audio_recorded_time(void) -{ - if(is_prerecording) - return prerecord_count * HZ; - - if(is_recording) - { - if(paused) - return pause_start_time - record_start_time; - else - return current_tick - record_start_time; - } - - return 0; -} - -unsigned long audio_num_recorded_bytes(void) -{ - int num_bytes; - int index; - - if(is_recording) - { - if(is_prerecording) - { - index = prerecord_index - prerecord_count; - if(index < 0) - index += prerecording_max_seconds; - - num_bytes = audiobuf_write - prerecord_buffer[index].mempos; - if(num_bytes < 0) - num_bytes += audiobuflen; - - return num_bytes; - } - else - return num_rec_bytes; - } - else - return 0; -} - -#else /* SIMULATOR */ - -/* dummies coming up */ - -void audio_init_playback(void) -{ - /* a dummy */ -} -unsigned long audio_recorded_time(void) -{ - /* a dummy */ - return 0; -} -void audio_beep(int duration) -{ - /* a dummy */ - (void)duration; -} -void audio_pause_recording(void) -{ - /* a dummy */ -} -void audio_resume_recording(void) -{ - /* a dummy */ -} -unsigned long audio_num_recorded_bytes(void) -{ - /* a dummy */ - return 0; -} -void audio_record(const char *filename) -{ - /* a dummy */ - (void)filename; -} -void audio_new_file(const char *filename) -{ - /* a dummy */ - (void)filename; -} - -void audio_set_recording_gain(int left, int right, int type) -{ - /* a dummy */ - (void)left; - (void)right; - (void)type; -} -void audio_init_recording(void) -{ - /* a dummy */ -} -void audio_set_recording_options(struct audio_recording_options *options) -{ - /* a dummy */ - (void)options; -} -#endif /* SIMULATOR */ -#endif /* CONFIG_CODEC == MAS3587F */ - size_t audio_buffer_size(void) { if (audiobuf_handle > 0) @@ -2977,14 +1913,6 @@ int audio_status(void) if(paused) ret |= AUDIO_STATUS_PAUSE; -#if (CONFIG_CODEC == MAS3587F) && !defined(SIMULATOR) - if(is_recording && !is_prerecording) - ret |= AUDIO_STATUS_RECORD; - - if(is_prerecording) - ret |= AUDIO_STATUS_PRERECORD; -#endif /* CONFIG_CODEC == MAS3587F */ - if(mpeg_errno) ret |= AUDIO_STATUS_ERROR; @@ -3039,13 +1967,6 @@ void audio_init(void) memset(trackdata, 0, sizeof(trackdata)); -#if (CONFIG_CODEC == MAS3587F) && !defined(SIMULATOR) - if (HW_MASK & PR_ACTIVE_HIGH) - and_b(~0x08, &PADRH); - else - or_b(0x08, &PADRH); -#endif /* CONFIG_CODEC == MAS3587F */ - #ifdef DEBUG #ifndef SIMULATOR dbg_timer_start(); -- cgit v1.2.3