summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-06-04 10:19:45 +0000
committerJens Arnold <amiconn@rockbox.org>2005-06-04 10:19:45 +0000
commitd9b66127acd955c2a29b03165ced3aa17cb7a4a4 (patch)
tree78edcd0faea56a6fb5e6b2f688beba4aae2aac11
parent9d14b73989b7703920c5f9542e46c07a90ed3e6a (diff)
downloadrockbox-d9b66127acd955c2a29b03165ced3aa17cb7a4a4.zip
rockbox-d9b66127acd955c2a29b03165ced3aa17cb7a4a4.tar.gz
rockbox-d9b66127acd955c2a29b03165ced3aa17cb7a4a4.tar.bz2
rockbox-d9b66127acd955c2a29b03165ced3aa17cb7a4a4.tar.xz
Recording screen rework: (1) Fixed irregular LED blinking on pause/ armed trigger. All redraw & LED intervals are now generated by the peakmeter_draw_get_button() delay alone, avoiding interference of different frequencies. (2) This also fixes irregular update intervals of the whole recording screen. (3) Code cleanup, smaller binary size. (4) Fixed gain limits (symmetric analog gain increase used mic gain limit, and so did the right analog gain decrease).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6559 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/recorder/recording.c316
1 files changed, 140 insertions, 176 deletions
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 7a6330f..d443f62 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -290,15 +290,12 @@ static void trigger_listener(int trigger_status)
}
}
-#define BLINK_MASK 0x10
-
bool recording_screen(void)
{
long button;
bool done = false;
char buf[32];
char buf2[32];
- long timeout = current_tick + HZ/10;
int gain;
int w, h;
int update_countdown = 1;
@@ -309,7 +306,8 @@ bool recording_screen(void)
bool been_in_usb_mode = false;
int last_audio_stat = -1;
#ifdef HAVE_LED
- bool last_led_stat = false;
+ bool led_state = false;
+ int led_countdown = 2;
#endif
const unsigned char *byte_units[] = {
@@ -366,17 +364,11 @@ bool recording_screen(void)
{
if (audio_stat & AUDIO_STATUS_PAUSE)
{
- /*
- This is supposed to be the same as
- led(current_tick & BLINK_MASK)
- But we do this hubub to prevent unnecessary hardware
- communication when the led already has the desired state.
- */
- if (last_led_stat != ((current_tick & BLINK_MASK) == BLINK_MASK))
+ if (--led_countdown <= 0)
{
- /* trigger is on in status TRIG_READY (no check needed) */
- last_led_stat = !last_led_stat;
- led(last_led_stat);
+ led_state = !led_state;
+ led(led_state);
+ led_countdown = 2;
}
}
else
@@ -388,21 +380,17 @@ bool recording_screen(void)
else
{
int trigStat = peak_meter_trigger_status();
-
- // other trigger stati than trig_off and trig_steady
- // already imply that we are recording.
+ /*
+ * other trigger stati than trig_off and trig_steady
+ * already imply that we are recording.
+ */
if (trigStat == TRIG_STEADY)
{
- /* This is supposed to be the same as
- led(current_tick & BLINK_MASK)
- But we do this hubub to prevent unnecessary hardware
- communication when the led already has the desired state.
- */
- if (last_led_stat != ((current_tick & BLINK_MASK) == BLINK_MASK))
+ if (--led_countdown <= 0)
{
- /* trigger is on in status TRIG_READY (no check needed) */
- last_led_stat = !last_led_stat;
- led(last_led_stat);
+ led_state = !led_state;
+ led(led_state);
+ led_countdown = 2;
}
}
else
@@ -413,7 +401,7 @@ bool recording_screen(void)
}
#endif /* HAVE_LED */
- /* Wait for a button while drawing the peak meter */
+ /* Wait for a button a while (HZ/10) drawing the peak meter */
button = peak_meter_draw_get_btn(0, 8 + h*2, LCD_WIDTH, h);
if (last_audio_stat != audio_stat)
@@ -428,20 +416,18 @@ bool recording_screen(void)
switch(button)
{
case REC_STOPEXIT:
+ /* turn off the trigger */
+ peak_meter_trigger(false);
+ peak_meter_set_trigger_listener(NULL);
+
if(audio_stat & AUDIO_STATUS_RECORD)
{
- /* turn off the trigger */
- peak_meter_trigger(false);
- peak_meter_set_trigger_listener(NULL);
audio_stop();
}
else
{
peak_meter_playback(true);
peak_meter_enabled = false;
- /* turn off the trigger */
- peak_meter_set_trigger_listener(NULL);
- peak_meter_trigger(false);
done = true;
}
update_countdown = 1; /* Update immediately */
@@ -459,7 +445,6 @@ bool recording_screen(void)
have_recorded = true;
talk_buffer_steal(); /* we use the mp3 buffer */
mpeg_record(rec_create_filename(path_buffer));
- update_countdown = 1; /* Update immediately */
last_seconds = 0;
if (global_settings.talk_menu)
{ /* no voice possible here, but a beep */
@@ -470,8 +455,6 @@ bool recording_screen(void)
/* this is triggered recording */
else
{
- update_countdown = 1; /* Update immediately */
-
/* we don't start recording now, but enable the
trigger and let the callback function
trigger_listener control when the recording starts */
@@ -493,8 +476,8 @@ bool recording_screen(void)
{
mpeg_pause_recording();
}
- update_countdown = 1; /* Update immediately */
}
+ update_countdown = 1; /* Update immediately */
break;
#ifdef REC_PREV
@@ -520,35 +503,29 @@ bool recording_screen(void)
case 0:
if(global_settings.rec_source == SOURCE_MIC)
{
- global_settings.rec_mic_gain++;
- if(global_settings.rec_mic_gain >
+ if(global_settings.rec_mic_gain <
sound_max(SOUND_MIC_GAIN))
- global_settings.rec_mic_gain =
- sound_max(SOUND_MIC_GAIN);
+ global_settings.rec_mic_gain++;
}
else
{
gain = MAX(global_settings.rec_left_gain,
- global_settings.rec_right_gain) + 1;
- if(gain > sound_max(SOUND_MIC_GAIN))
- gain = sound_max(SOUND_MIC_GAIN);
+ global_settings.rec_right_gain);
+ if(gain < sound_max(SOUND_LEFT_GAIN))
+ gain++;
global_settings.rec_left_gain = gain;
global_settings.rec_right_gain = gain;
}
break;
case 1:
- global_settings.rec_left_gain++;
- if(global_settings.rec_left_gain >
+ if(global_settings.rec_left_gain <
sound_max(SOUND_LEFT_GAIN))
- global_settings.rec_left_gain =
- sound_max(SOUND_LEFT_GAIN);
+ global_settings.rec_left_gain++;
break;
case 2:
- global_settings.rec_right_gain++;
- if(global_settings.rec_right_gain >
+ if(global_settings.rec_right_gain <
sound_max(SOUND_RIGHT_GAIN))
- global_settings.rec_right_gain =
- sound_max(SOUND_RIGHT_GAIN);
+ global_settings.rec_right_gain++;
break;
}
set_gain();
@@ -562,35 +539,29 @@ bool recording_screen(void)
case 0:
if(global_settings.rec_source == SOURCE_MIC)
{
- global_settings.rec_mic_gain--;
- if(global_settings.rec_mic_gain <
+ if(global_settings.rec_mic_gain >
sound_min(SOUND_MIC_GAIN))
- global_settings.rec_mic_gain =
- sound_min(SOUND_MIC_GAIN);
+ global_settings.rec_mic_gain--;
}
else
{
gain = MAX(global_settings.rec_left_gain,
- global_settings.rec_right_gain) - 1;
- if(gain < sound_min(SOUND_LEFT_GAIN))
- gain = sound_min(SOUND_LEFT_GAIN);
+ global_settings.rec_right_gain);
+ if(gain > sound_min(SOUND_LEFT_GAIN))
+ gain--;
global_settings.rec_left_gain = gain;
global_settings.rec_right_gain = gain;
}
break;
case 1:
- global_settings.rec_left_gain--;
- if(global_settings.rec_left_gain <
+ if(global_settings.rec_left_gain >
sound_min(SOUND_LEFT_GAIN))
- global_settings.rec_left_gain =
- sound_min(SOUND_LEFT_GAIN);
+ global_settings.rec_left_gain--;
break;
case 2:
- global_settings.rec_right_gain--;
- if(global_settings.rec_right_gain <
- sound_min(SOUND_MIC_GAIN))
- global_settings.rec_right_gain =
- sound_min(SOUND_MIC_GAIN);
+ if(global_settings.rec_right_gain >
+ sound_min(SOUND_RIGHT_GAIN))
+ global_settings.rec_right_gain--;
break;
}
set_gain();
@@ -691,139 +662,134 @@ bool recording_screen(void)
break;
}
- if(TIME_AFTER(current_tick, timeout))
- {
- lcd_setfont(FONT_SYSFIXED);
-
- timeout = current_tick + HZ/10;
+ lcd_setfont(FONT_SYSFIXED);
- seconds = mpeg_recorded_time() / HZ;
-
- update_countdown--;
- if(update_countdown == 0 || seconds > last_seconds)
- {
- unsigned int dseconds, dhours, dminutes;
- int pos = 0;
+ seconds = mpeg_recorded_time() / HZ;
+
+ update_countdown--;
+ if(update_countdown == 0 || seconds > last_seconds)
+ {
+ unsigned int dseconds, dhours, dminutes;
+ int pos = 0;
- update_countdown = 5;
- last_seconds = seconds;
+ update_countdown = 5;
+ last_seconds = seconds;
- lcd_clear_display();
+ lcd_clear_display();
- hours = seconds / 3600;
- minutes = (seconds - (hours * 3600)) / 60;
- snprintf(buf, 32, "%s %02d:%02d:%02d",
- str(LANG_RECORDING_TIME),
- hours, minutes, seconds%60);
- lcd_puts(0, 0, buf);
+ hours = seconds / 3600;
+ minutes = (seconds - (hours * 3600)) / 60;
+ snprintf(buf, 32, "%s %02d:%02d:%02d",
+ str(LANG_RECORDING_TIME),
+ hours, minutes, seconds%60);
+ lcd_puts(0, 0, buf);
- dseconds = rec_timesplit_seconds();
+ dseconds = rec_timesplit_seconds();
- if(audio_stat & AUDIO_STATUS_PRERECORD)
+ if(audio_stat & AUDIO_STATUS_PRERECORD)
+ {
+ snprintf(buf, 32, "%s...", str(LANG_RECORD_PRERECORD));
+ }
+ else
+ {
+ /* Display the split interval if the record timesplit
+ is active */
+ if (global_settings.rec_timesplit)
{
- snprintf(buf, 32, "%s...", str(LANG_RECORD_PRERECORD));
+ /* Display the record timesplit interval rather
+ than the file size if the record timer is
+ active */
+ dhours = dseconds / 3600;
+ dminutes = (dseconds - (dhours * 3600)) / 60;
+ snprintf(buf, 32, "%s %02d:%02d",
+ str(LANG_RECORD_TIMESPLIT_REC),
+ dhours, dminutes);
}
else
{
- /* Display the split interval if the record timesplit
- is active */
- if (global_settings.rec_timesplit)
- {
- /* Display the record timesplit interval rather
- than the file size if the record timer is
- active */
- dhours = dseconds / 3600;
- dminutes = (dseconds - (dhours * 3600)) / 60;
- snprintf(buf, 32, "%s %02d:%02d",
- str(LANG_RECORD_TIMESPLIT_REC),
- dhours, dminutes);
- }
- else
- {
- output_dyn_value(buf2, sizeof buf2,
- mpeg_num_recorded_bytes(),
- byte_units, true);
- snprintf(buf, 32, "%s %s",
- str(LANG_RECORDING_SIZE), buf2);
- }
+ output_dyn_value(buf2, sizeof buf2,
+ mpeg_num_recorded_bytes(),
+ byte_units, true);
+ snprintf(buf, 32, "%s %s",
+ str(LANG_RECORDING_SIZE), buf2);
}
- lcd_puts(0, 1, buf);
+ }
+ lcd_puts(0, 1, buf);
- /* We will do file splitting regardless, since the OFF
- setting really means 24 hours. This is to make sure
- that the recorded files don't get too big. */
- if (audio_stat && (seconds >= dseconds))
- {
- mpeg_new_file(rec_create_filename(path_buffer));
- update_countdown = 1;
- last_seconds = 0;
- }
+ /* We will do file splitting regardless, since the OFF
+ setting really means 24 hours. This is to make sure
+ that the recorded files don't get too big. */
+ if (audio_stat && (seconds >= dseconds))
+ {
+ mpeg_new_file(rec_create_filename(path_buffer));
+ update_countdown = 1;
+ last_seconds = 0;
+ }
- /* Show mic gain if input source is Mic */
- if(global_settings.rec_source == 0)
+ /* Show mic gain if input source is Mic */
+ if(global_settings.rec_source == 0)
+ {
+ snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
+ fmt_gain(SOUND_MIC_GAIN,
+ global_settings.rec_mic_gain,
+ buf2, sizeof(buf2)));
+ if (global_settings.invert_cursor && (pos++ == cursor))
+ lcd_puts_style(0, 4, buf, STYLE_INVERT);
+ else
+ lcd_puts(0, 4, buf);
+ }
+ else
+ {
+ if(global_settings.rec_source == SOURCE_LINE)
{
+ gain = MAX(global_settings.rec_left_gain,
+ global_settings.rec_right_gain);
+
snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
- fmt_gain(SOUND_MIC_GAIN,
- global_settings.rec_mic_gain,
+ fmt_gain(SOUND_LEFT_GAIN, gain,
buf2, sizeof(buf2)));
if (global_settings.invert_cursor && (pos++ == cursor))
lcd_puts_style(0, 4, buf, STYLE_INVERT);
else
lcd_puts(0, 4, buf);
- }
- else
- {
- if(global_settings.rec_source == SOURCE_LINE)
- {
- gain = MAX(global_settings.rec_left_gain,
- global_settings.rec_right_gain);
-
- snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
- fmt_gain(SOUND_LEFT_GAIN, gain,
- buf2, sizeof(buf2)));
- if (global_settings.invert_cursor && (pos++ == cursor))
- lcd_puts_style(0, 4, buf, STYLE_INVERT);
- else
- lcd_puts(0, 4, buf);
-
- snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_LEFT),
- fmt_gain(SOUND_LEFT_GAIN,
- global_settings.rec_left_gain,
- buf2, sizeof(buf2)));
- if (global_settings.invert_cursor && (pos++ == cursor))
- lcd_puts_style(0, 5, buf, STYLE_INVERT);
- else
- lcd_puts(0, 5, buf);
-
- snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_RIGHT),
- fmt_gain(SOUND_RIGHT_GAIN,
- global_settings.rec_right_gain,
- buf2, sizeof(buf2)));
- if (global_settings.invert_cursor && (pos++ == cursor))
- lcd_puts_style(0, 6, buf, STYLE_INVERT);
- else
- lcd_puts(0, 6, buf);
- }
- }
- if(global_settings.rec_source != SOURCE_SPDIF)
- put_cursorxy(0, 4 + cursor, true);
+ snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_LEFT),
+ fmt_gain(SOUND_LEFT_GAIN,
+ global_settings.rec_left_gain,
+ buf2, sizeof(buf2)));
+ if (global_settings.invert_cursor && (pos++ == cursor))
+ lcd_puts_style(0, 5, buf, STYLE_INVERT);
+ else
+ lcd_puts(0, 5, buf);
- if (global_settings.rec_source != SOURCE_LINE) {
- snprintf(buf, 32, "%s %s [%d]",
- freq_str[global_settings.rec_frequency],
- global_settings.rec_channels?
- str(LANG_CHANNEL_MONO):str(LANG_CHANNEL_STEREO),
- global_settings.rec_quality);
- lcd_puts(0, 6, buf);
+ snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_RIGHT),
+ fmt_gain(SOUND_RIGHT_GAIN,
+ global_settings.rec_right_gain,
+ buf2, sizeof(buf2)));
+ if (global_settings.invert_cursor && (pos++ == cursor))
+ lcd_puts_style(0, 6, buf, STYLE_INVERT);
+ else
+ lcd_puts(0, 6, buf);
}
+ }
- status_draw(true);
- peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h);
+ if(global_settings.rec_source != SOURCE_SPDIF)
+ put_cursorxy(0, 4 + cursor, true);
- lcd_update();
+ if (global_settings.rec_source != SOURCE_LINE) {
+ snprintf(buf, 32, "%s %s [%d]",
+ freq_str[global_settings.rec_frequency],
+ global_settings.rec_channels?
+ str(LANG_CHANNEL_MONO):str(LANG_CHANNEL_STEREO),
+ global_settings.rec_quality);
+ lcd_puts(0, 6, buf);
}
+ status_draw(true);
+ peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h);
+
+ lcd_update();
+
/* draw the trigger status */
if (peak_meter_trigger_status() != TRIG_OFF)
{
@@ -839,8 +805,6 @@ bool recording_screen(void)
}
}
- invert_led(false);
-
if(audio_status() & AUDIO_STATUS_ERROR)
{
splash(0, true, str(LANG_DISK_FULL));