diff options
Diffstat (limited to 'apps/recorder/peakmeter.c')
-rw-r--r-- | apps/recorder/peakmeter.c | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/apps/recorder/peakmeter.c b/apps/recorder/peakmeter.c index 7d97bd3b02..f3f5d67c9c 100644 --- a/apps/recorder/peakmeter.c +++ b/apps/recorder/peakmeter.c | |||
@@ -16,6 +16,9 @@ | |||
16 | * KIND, either express or implied. | 16 | * KIND, either express or implied. |
17 | * | 17 | * |
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #ifdef SIMULATOR | ||
20 | #include <stdlib.h> /* sim uses rand for peakmeter simulation */ | ||
21 | #endif | ||
19 | #include "config.h" | 22 | #include "config.h" |
20 | #include "mas.h" | 23 | #include "mas.h" |
21 | #include "thread.h" | 24 | #include "thread.h" |
@@ -47,7 +50,6 @@ | |||
47 | #endif | 50 | #endif |
48 | 51 | ||
49 | static bool pm_playback = true; /* selects between playback and recording peaks */ | 52 | static bool pm_playback = true; /* selects between playback and recording peaks */ |
50 | |||
51 | #endif | 53 | #endif |
52 | 54 | ||
53 | static struct meter_scales scales[NB_SCREENS]; | 55 | static struct meter_scales scales[NB_SCREENS]; |
@@ -74,6 +76,10 @@ static bool pm_clip_right = false; | |||
74 | static long pm_clip_timeout_l; /* clip hold timeouts */ | 76 | static long pm_clip_timeout_l; /* clip hold timeouts */ |
75 | static long pm_clip_timeout_r; | 77 | static long pm_clip_timeout_r; |
76 | 78 | ||
79 | /* clipping counter (only used for recording) */ | ||
80 | static unsigned int pm_clipcount = 0; /* clipping count */ | ||
81 | static bool pm_clipcount_active = false; /* counting or not */ | ||
82 | |||
77 | /* Temporarily en- / disables peak meter. This is especially for external | 83 | /* Temporarily en- / disables peak meter. This is especially for external |
78 | applications to detect if the peak_meter is in use and needs drawing at all */ | 84 | applications to detect if the peak_meter is in use and needs drawing at all */ |
79 | bool peak_meter_enabled = true; | 85 | bool peak_meter_enabled = true; |
@@ -491,6 +497,30 @@ void peak_meter_init_times(int release, int hold, int clip_hold) | |||
491 | } | 497 | } |
492 | 498 | ||
493 | /** | 499 | /** |
500 | * Enable/disable clip counting | ||
501 | */ | ||
502 | void pm_activate_clipcount(bool active) | ||
503 | { | ||
504 | pm_clipcount_active = active; | ||
505 | } | ||
506 | |||
507 | /** | ||
508 | * Get clipping counter value | ||
509 | */ | ||
510 | int pm_get_clipcount(void) | ||
511 | { | ||
512 | return pm_clipcount; | ||
513 | } | ||
514 | |||
515 | /** | ||
516 | * Set clipping counter to zero (typically at start of recording or playback) | ||
517 | */ | ||
518 | void pm_reset_clipcount(void) | ||
519 | { | ||
520 | pm_clipcount = 0; | ||
521 | } | ||
522 | |||
523 | /** | ||
494 | * Set the source of the peak meter to playback or to | 524 | * Set the source of the peak meter to playback or to |
495 | * record. | 525 | * record. |
496 | * @param: bool playback - If true playback peak meter is used. | 526 | * @param: bool playback - If true playback peak meter is used. |
@@ -523,6 +553,7 @@ static void set_trig_status(int new_state) | |||
523 | } | 553 | } |
524 | } | 554 | } |
525 | } | 555 | } |
556 | |||
526 | #endif | 557 | #endif |
527 | 558 | ||
528 | /** | 559 | /** |
@@ -535,6 +566,7 @@ static void set_trig_status(int new_state) | |||
535 | void peak_meter_peek(void) | 566 | void peak_meter_peek(void) |
536 | { | 567 | { |
537 | int left, right; | 568 | int left, right; |
569 | bool was_clipping = pm_clip_left || pm_clip_right; | ||
538 | /* read current values */ | 570 | /* read current values */ |
539 | #if CONFIG_CODEC == SWCODEC | 571 | #if CONFIG_CODEC == SWCODEC |
540 | if (pm_playback) | 572 | if (pm_playback) |
@@ -585,6 +617,12 @@ void peak_meter_peek(void) | |||
585 | current_tick + clip_time_out[pm_clip_hold]; | 617 | current_tick + clip_time_out[pm_clip_hold]; |
586 | } | 618 | } |
587 | 619 | ||
620 | if(!was_clipping && (pm_clip_left || pm_clip_right)) | ||
621 | { | ||
622 | if(pm_clipcount_active) | ||
623 | pm_clipcount++; | ||
624 | } | ||
625 | |||
588 | /* peaks are searched -> we have to find the maximum. When | 626 | /* peaks are searched -> we have to find the maximum. When |
589 | many calls of peak_meter_peek the maximum value will be | 627 | many calls of peak_meter_peek the maximum value will be |
590 | stored in pm_max_xxx. This maximum is reset by the | 628 | stored in pm_max_xxx. This maximum is reset by the |
@@ -757,6 +795,12 @@ static int peak_meter_read_l(void) | |||
757 | /* reset pm_max_left so that subsequent calls of peak_meter_peek don't | 795 | /* reset pm_max_left so that subsequent calls of peak_meter_peek don't |
758 | get fooled by an old maximum value */ | 796 | get fooled by an old maximum value */ |
759 | pm_max_left = pm_cur_left; | 797 | pm_max_left = pm_cur_left; |
798 | |||
799 | #ifdef SIMULATOR | ||
800 | srand(current_tick); | ||
801 | retval = rand()%MAX_PEAK; | ||
802 | #endif | ||
803 | |||
760 | return retval; | 804 | return retval; |
761 | } | 805 | } |
762 | 806 | ||
@@ -782,6 +826,12 @@ static int peak_meter_read_r(void) | |||
782 | /* reset pm_max_right so that subsequent calls of peak_meter_peek don't | 826 | /* reset pm_max_right so that subsequent calls of peak_meter_peek don't |
783 | get fooled by an old maximum value */ | 827 | get fooled by an old maximum value */ |
784 | pm_max_right = pm_cur_right; | 828 | pm_max_right = pm_cur_right; |
829 | |||
830 | #ifdef SIMULATOR | ||
831 | srand(current_tick); | ||
832 | retval = rand()%MAX_PEAK; | ||
833 | #endif | ||
834 | |||
785 | return retval; | 835 | return retval; |
786 | } | 836 | } |
787 | 837 | ||
@@ -860,7 +910,7 @@ unsigned short peak_meter_scale_value(unsigned short val, int meterwidth) | |||
860 | void peak_meter_screen(struct screen *display, int x, int y, int height) | 910 | void peak_meter_screen(struct screen *display, int x, int y, int height) |
861 | { | 911 | { |
862 | peak_meter_draw(display, &scales[display->screen_type], x, y, | 912 | peak_meter_draw(display, &scales[display->screen_type], x, y, |
863 | display->width, height); | 913 | display->width - x, height); |
864 | } | 914 | } |
865 | /** | 915 | /** |
866 | * Draws a peak meter in the specified size at the specified position. | 916 | * Draws a peak meter in the specified size at the specified position. |
@@ -1282,7 +1332,7 @@ int peak_meter_draw_get_btn(int x, int y[], int height, int nb_screens) | |||
1282 | for(i = 0; i < nb_screens; i++) | 1332 | for(i = 0; i < nb_screens; i++) |
1283 | { | 1333 | { |
1284 | peak_meter_screen(&screens[i], x, y[i], height); | 1334 | peak_meter_screen(&screens[i], x, y[i], height); |
1285 | screens[i].update_rect(x, y[i], screens[i].width, height); | 1335 | screens[i].update_rect(x, y[i], screens[i].width - x, height); |
1286 | } | 1336 | } |
1287 | next_refresh += HZ / PEAK_METER_FPS; | 1337 | next_refresh += HZ / PEAK_METER_FPS; |
1288 | dopeek = true; | 1338 | dopeek = true; |