diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2006-11-06 18:07:30 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2006-11-06 18:07:30 +0000 |
commit | 0f5cb94aa4a334366a746fcbb22f3335ca413265 (patch) | |
tree | 8f89a96628c1810d51ee9816daf78edb8c76fcd4 /apps/gui/statusbar.c | |
parent | 0b22795e26ee09de14f6ac23219adeda12f2fd5b (diff) | |
download | rockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.tar.gz rockbox-0f5cb94aa4a334366a746fcbb22f3335ca413265.zip |
Big Patch adds primarily: Samplerate and format selection to recording for SWCODEC. Supprort for samplerates changing in playback (just goes with the recording part inseparably). Samplerates to all encoders. Encoders can be configured individually on a menu specific to the encoder in the recording menu. File creation is delayed until flush time to reduce spinups when splitting. Misc: statusbar icons for numbers are individual digits to display any number. Audio buffer was rearranged to maximize memory available to recording and properly reinitialized when trashed. ColdFire PCM stuff moved to target tree to avoid a complicated mess when adding samplerate switching. Some needed API changes and to neaten up growing gap between hardware and software codecs.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11452 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/statusbar.c')
-rw-r--r-- | apps/gui/statusbar.c | 196 |
1 files changed, 118 insertions, 78 deletions
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c index a8b8c5061b..ae8bba0538 100644 --- a/apps/gui/statusbar.c +++ b/apps/gui/statusbar.c | |||
@@ -124,19 +124,6 @@ | |||
124 | #endif | 124 | #endif |
125 | #define STATUSBAR_TIME_X_END(statusbar_width) statusbar_width - 1 - \ | 125 | #define STATUSBAR_TIME_X_END(statusbar_width) statusbar_width - 1 - \ |
126 | STATUSBAR_DISK_WIDTH | 126 | STATUSBAR_DISK_WIDTH |
127 | #if defined(HAVE_RECORDING) | ||
128 | /* analogue frequency numbers taken from the order of frequencies in sample_rate */ | ||
129 | #define FREQ_44 7 | ||
130 | #define FREQ_48 8 | ||
131 | #define FREQ_32 6 | ||
132 | #define FREQ_22 4 | ||
133 | #define FREQ_24 5 | ||
134 | #define FREQ_16 3 | ||
135 | #ifdef HAVE_SPDIF_IN | ||
136 | #define SOURCE_SPDIF 2 | ||
137 | #endif | ||
138 | #endif | ||
139 | |||
140 | struct gui_syncstatusbar statusbars; | 127 | struct gui_syncstatusbar statusbars; |
141 | 128 | ||
142 | void gui_statusbar_init(struct gui_statusbar * bar) | 129 | void gui_statusbar_init(struct gui_statusbar * bar) |
@@ -600,41 +587,113 @@ void gui_statusbar_time(struct screen * display, int hour, int minute) | |||
600 | #endif | 587 | #endif |
601 | 588 | ||
602 | #ifdef HAVE_RECORDING | 589 | #ifdef HAVE_RECORDING |
603 | void gui_statusbar_icon_recording_info(struct screen * display) | 590 | #if CONFIG_CODEC == SWCODEC |
591 | /** | ||
592 | * Write a number to the display using bitmaps and return new position | ||
593 | */ | ||
594 | static int write_bitmap_number(struct screen * display, int value, | ||
595 | int x, int y) | ||
604 | { | 596 | { |
605 | #if (CONFIG_CODEC != SWCODEC) || (defined(SIMULATOR) && defined(HAVE_SPDIF_IN)) | 597 | char buf[12], *ptr; |
606 | char buffer[3]; | 598 | snprintf(buf, sizeof(buf), "%d", value); |
599 | |||
600 | for (ptr = buf; *ptr != '\0'; ptr++, x += BM_GLYPH_WIDTH) | ||
601 | display->mono_bitmap(bitmap_glyphs_4x8[*ptr - '0'], x, y, | ||
602 | BM_GLYPH_WIDTH, STATUSBAR_HEIGHT); | ||
603 | return x; | ||
604 | } | ||
605 | |||
606 | /** | ||
607 | * Write format info bitmaps - right justified | ||
608 | */ | ||
609 | static void gui_statusbar_write_format_info(struct screen * display) | ||
610 | { | ||
611 | /* Can't fit info for sw codec targets in statusbar using FONT_SYSFIXED | ||
612 | so must use icons */ | ||
613 | int rec_format = global_settings.rec_format; | ||
614 | unsigned bitrk = 0; /* compiler warns about unitialized use !! */ | ||
615 | int xpos = STATUSBAR_ENCODER_X_POS; | ||
616 | int width = STATUSBAR_ENCODER_WIDTH; | ||
617 | const unsigned char *bm = bitmap_formats_18x8[rec_format]; | ||
618 | |||
619 | if (rec_format == REC_FORMAT_MPA_L3) | ||
620 | { | ||
621 | /* Special handling for mp3 */ | ||
622 | bitrk = global_settings.mp3_enc_config.bitrate; | ||
623 | bitrk = mp3_enc_bitr[bitrk]; | ||
624 | |||
625 | width = BM_MPA_L3_M_WIDTH; | ||
626 | |||
627 | /* Slide 'M' to right if fewer than three digits used */ | ||
628 | if (bitrk > 999) | ||
629 | bitrk = 999; /* neurotic safety check if corrupted */ | ||
630 | else | ||
631 | { | ||
632 | if (bitrk < 100) | ||
633 | xpos += BM_GLYPH_WIDTH; | ||
634 | if (bitrk < 10) | ||
635 | xpos += BM_GLYPH_WIDTH; | ||
636 | } | ||
637 | } | ||
638 | |||
639 | |||
640 | /* Show bitmap - clipping right edge if needed */ | ||
641 | display->mono_bitmap_part(bm, 0, 0, STATUSBAR_ENCODER_WIDTH, | ||
642 | xpos, STATUSBAR_Y_POS, width, STATUSBAR_HEIGHT); | ||
643 | |||
644 | if (rec_format == REC_FORMAT_MPA_L3) | ||
645 | { | ||
646 | xpos += BM_MPA_L3_M_WIDTH; /* to right of 'M' */ | ||
647 | write_bitmap_number(display, bitrk, xpos, STATUSBAR_Y_POS); | ||
648 | } | ||
649 | } | ||
650 | |||
651 | /** | ||
652 | * Write sample rate using bitmaps - left justified | ||
653 | */ | ||
654 | static void gui_statusbar_write_samplerate_info(struct screen * display) | ||
655 | { | ||
656 | unsigned long samprk; | ||
657 | int xpos; | ||
658 | |||
659 | #ifdef SIMULATOR | ||
660 | samprk = 44100; | ||
661 | #else | ||
662 | #ifdef HAVE_SPDIF_IN | ||
663 | if (global_settings.rec_source == AUDIO_SRC_SPDIF) | ||
664 | /* Use rate in use, not current measured rate if it changed */ | ||
665 | samprk = pcm_rec_sample_rate(); | ||
666 | else | ||
607 | #endif | 667 | #endif |
668 | samprk = rec_freq_sampr[global_settings.rec_frequency]; | ||
669 | #endif /* SIMULATOR */ | ||
670 | |||
671 | samprk /= 1000; | ||
672 | if (samprk > 99) | ||
673 | samprk = 99; /* Limit to 3 glyphs */ | ||
674 | |||
675 | xpos = write_bitmap_number(display, (unsigned)samprk, | ||
676 | STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS); | ||
677 | |||
678 | /* write the 'k' */ | ||
679 | display->mono_bitmap(bitmap_glyphs_4x8[Glyph_4x8_k], xpos, | ||
680 | STATUSBAR_Y_POS, BM_GLYPH_WIDTH, | ||
681 | STATUSBAR_HEIGHT); | ||
682 | } | ||
683 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
684 | |||
685 | void gui_statusbar_icon_recording_info(struct screen * display) | ||
686 | { | ||
608 | #if CONFIG_CODEC != SWCODEC | 687 | #if CONFIG_CODEC != SWCODEC |
688 | char buffer[3]; | ||
609 | int width, height; | 689 | int width, height; |
610 | static char* const sample_rate[12] = | ||
611 | { | ||
612 | "8", | ||
613 | "11", | ||
614 | "12", | ||
615 | "16", | ||
616 | "22", | ||
617 | "24", | ||
618 | "32", | ||
619 | "44", | ||
620 | "48", | ||
621 | "64", | ||
622 | "88", | ||
623 | "96" | ||
624 | }; | ||
625 | |||
626 | display->setfont(FONT_SYSFIXED); | 690 | display->setfont(FONT_SYSFIXED); |
627 | #endif | 691 | #endif /* CONFIG_CODEC != SWCODEC */ |
628 | 692 | ||
629 | /* Display Codec info in statusbar */ | 693 | /* Display Codec info in statusbar */ |
630 | #if CONFIG_CODEC == SWCODEC | 694 | #if CONFIG_CODEC == SWCODEC |
631 | /* Can't fit info for sw codec targets in statusbar using FONT_SYSFIXED | 695 | gui_statusbar_write_format_info(display); |
632 | so must use icons */ | 696 | #else /* !SWCODEC */ |
633 | display->mono_bitmap(bitmap_icons_18x8[global_settings.rec_quality], | ||
634 | STATUSBAR_ENCODER_X_POS, STATUSBAR_Y_POS, | ||
635 | STATUSBAR_ENCODER_WIDTH, STATUSBAR_HEIGHT); | ||
636 | #else | ||
637 | |||
638 | display->mono_bitmap(bitmap_icons_5x8[Icon_q], | 697 | display->mono_bitmap(bitmap_icons_5x8[Icon_q], |
639 | STATUSBAR_ENCODER_X_POS + 8, STATUSBAR_Y_POS, | 698 | STATUSBAR_ENCODER_X_POS + 8, STATUSBAR_Y_POS, |
640 | 5, STATUSBAR_HEIGHT); | 699 | 5, STATUSBAR_HEIGHT); |
@@ -643,56 +702,37 @@ void gui_statusbar_icon_recording_info(struct screen * display) | |||
643 | display->getstringsize(buffer, &width, &height); | 702 | display->getstringsize(buffer, &width, &height); |
644 | if (height <= STATUSBAR_HEIGHT) | 703 | if (height <= STATUSBAR_HEIGHT) |
645 | display->putsxy(STATUSBAR_ENCODER_X_POS + 13, STATUSBAR_Y_POS, buffer); | 704 | display->putsxy(STATUSBAR_ENCODER_X_POS + 13, STATUSBAR_Y_POS, buffer); |
646 | #endif | 705 | #endif /* CONFIG_CODEC == SWCODEC */ |
647 | 706 | ||
648 | /* Display Samplerate info in statusbar */ | 707 | /* Display Samplerate info in statusbar */ |
649 | #if defined(HAVE_SPDIF_IN) | 708 | #if CONFIG_CODEC == SWCODEC |
650 | if (global_settings.rec_source == SOURCE_SPDIF) | 709 | /* SWCODEC targets use bitmaps for glyphs */ |
710 | gui_statusbar_write_samplerate_info(display); | ||
711 | #else /* !SWCODEC */ | ||
712 | /* hwcodec targets have sysfont characters */ | ||
713 | #ifdef HAVE_SPDIF_IN | ||
714 | if (global_settings.rec_source == AUDIO_SRC_SPDIF) | ||
651 | { | 715 | { |
652 | #if (CONFIG_CODEC != MAS3587F) && !defined(SIMULATOR) | ||
653 | display->mono_bitmap(bitmap_icons_12x8[audio_get_spdif_sample_rate()], | ||
654 | STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS, | ||
655 | STATUSBAR_RECFREQ_WIDTH, STATUSBAR_HEIGHT); | ||
656 | #else | ||
657 | /* Can't measure S/PDIF sample rate on Archos/Sim yet */ | 716 | /* Can't measure S/PDIF sample rate on Archos/Sim yet */ |
658 | snprintf(buffer, sizeof(buffer), "--"); | 717 | snprintf(buffer, sizeof(buffer), "--"); |
659 | #endif | ||
660 | } | 718 | } |
661 | else | 719 | else |
662 | #endif /* HAVE_SPDIF_IN */ | 720 | #endif /* HAVE_SPDIF_IN */ |
663 | { | 721 | { |
664 | /* Analogue frequency in wrong order so remap settings numbers */ | 722 | static char const * const freq_strings[12] = |
665 | int freq = global_settings.rec_frequency; | 723 | { "44", "48", "32", "22", "24", "16" }; |
666 | if (freq == 0) | 724 | snprintf(buffer, sizeof(buffer), "%s", |
667 | freq = FREQ_44; | 725 | freq_strings[global_settings.rec_frequency]); |
668 | else if (freq == 1) | ||
669 | freq = FREQ_48; | ||
670 | else if (freq == 2) | ||
671 | freq = FREQ_32; | ||
672 | else if (freq == 3) | ||
673 | freq = FREQ_22; | ||
674 | else if (freq == 4) | ||
675 | freq = FREQ_24; | ||
676 | else if (freq == 5) | ||
677 | freq = FREQ_16; | ||
678 | |||
679 | #if CONFIG_CODEC == SWCODEC | ||
680 | /* samplerate icons for swcodec targets*/ | ||
681 | display->mono_bitmap(bitmap_icons_12x8[freq], | ||
682 | STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS, | ||
683 | STATUSBAR_RECFREQ_WIDTH, STATUSBAR_HEIGHT); | ||
684 | } | ||
685 | #else | ||
686 | /* hwcodec targets have sysfont characters */ | ||
687 | snprintf(buffer, sizeof(buffer), "%s", sample_rate[freq]); | ||
688 | display->getstringsize(buffer, &width, &height); | ||
689 | } | 726 | } |
690 | 727 | ||
691 | if (height <= STATUSBAR_HEIGHT) | 728 | display->getstringsize(buffer, &width, &height); |
692 | display->putsxy(STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS, buffer); | 729 | |
730 | if (height <= STATUSBAR_HEIGHT) | ||
731 | display->putsxy(STATUSBAR_RECFREQ_X_POS, STATUSBAR_Y_POS, buffer); | ||
732 | |||
733 | display->setfont(FONT_UI); | ||
734 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
693 | 735 | ||
694 | display->setfont(FONT_UI); | ||
695 | #endif | ||
696 | /* Display Channel status in status bar */ | 736 | /* Display Channel status in status bar */ |
697 | if(global_settings.rec_channels) | 737 | if(global_settings.rec_channels) |
698 | { | 738 | { |