diff options
-rw-r--r-- | apps/pcmbuf.c | 105 | ||||
-rw-r--r-- | apps/pcmbuf.h | 3 |
2 files changed, 53 insertions, 55 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index c79b0d5fd9..31b59f88f6 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c | |||
@@ -97,7 +97,7 @@ static size_t last_chunksize IDATA_ATTR; | |||
97 | static size_t pcmbuf_unplayed_bytes IDATA_ATTR; | 97 | static size_t pcmbuf_unplayed_bytes IDATA_ATTR; |
98 | static size_t pcmbuf_mix_used_bytes IDATA_ATTR; | 98 | static size_t pcmbuf_mix_used_bytes IDATA_ATTR; |
99 | static size_t pcmbuf_watermark IDATA_ATTR; | 99 | static size_t pcmbuf_watermark IDATA_ATTR; |
100 | static size_t mixpos IDATA_ATTR = 0; | 100 | static short *mixpos IDATA_ATTR; |
101 | static bool low_latency_mode = false; | 101 | static bool low_latency_mode = false; |
102 | 102 | ||
103 | /* Helpful macros for use in conditionals this assumes some of the above | 103 | /* Helpful macros for use in conditionals this assumes some of the above |
@@ -805,13 +805,6 @@ void pcmbuf_write_complete(size_t length) | |||
805 | } | 805 | } |
806 | } | 806 | } |
807 | 807 | ||
808 | void pcmbuf_write_voice(size_t length) | ||
809 | { | ||
810 | while (pcm_is_playing()) | ||
811 | sleep(1); | ||
812 | pcm_play_data(NULL, &guardbuf[0], length); | ||
813 | } | ||
814 | |||
815 | bool pcmbuf_insert_buffer(const char *buf, size_t length) | 808 | bool pcmbuf_insert_buffer(const char *buf, size_t length) |
816 | { | 809 | { |
817 | if (!prepare_insert(length)) | 810 | if (!prepare_insert(length)) |
@@ -827,52 +820,63 @@ bool pcmbuf_insert_buffer(const char *buf, size_t length) | |||
827 | return true; | 820 | return true; |
828 | } | 821 | } |
829 | 822 | ||
823 | /* Get a pointer to where to mix immediate audio */ | ||
824 | static inline short* get_mix_insert_pos(void) { | ||
825 | /* Give at least 1/8s clearance here */ | ||
826 | size_t pcmbuf_mix_back_pos = | ||
827 | pcmbuf_unplayed_bytes - NATIVE_FREQUENCY * 4 / 8; | ||
828 | |||
829 | if (audiobuffer_pos < pcmbuf_mix_back_pos) | ||
830 | return (short *)&audiobuffer[pcmbuf_size + | ||
831 | audiobuffer_pos - pcmbuf_mix_back_pos]; | ||
832 | else | ||
833 | return (short *)&audiobuffer[audiobuffer_pos - pcmbuf_mix_back_pos]; | ||
834 | } | ||
835 | |||
830 | /* Generates a constant square wave sound with a given frequency | 836 | /* Generates a constant square wave sound with a given frequency |
831 | in Hertz for a duration in milliseconds. */ | 837 | in Hertz for a duration in milliseconds. */ |
832 | void pcmbuf_beep(int frequency, int duration, int amplitude) | 838 | void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) |
833 | { | 839 | { |
834 | unsigned int state = 0, count = 0; | 840 | unsigned int count = 0, i = 0; |
841 | bool state = false; | ||
835 | unsigned int interval = NATIVE_FREQUENCY / frequency; | 842 | unsigned int interval = NATIVE_FREQUENCY / frequency; |
836 | size_t pos; | 843 | short *buf; |
837 | short *buf = (short *)audiobuffer; | 844 | short *pcmbuf_end = (short *)guardbuf; |
838 | size_t bufsize = pcmbuf_size / 2; | 845 | bool playing = pcm_is_playing(); |
846 | size_t samples = NATIVE_FREQUENCY / 1000 * duration; | ||
839 | 847 | ||
840 | /* FIXME: Should start playback. */ | 848 | if (playing) { |
841 | //if (pcmbuf_unplayed_bytes * 1000 < 4 * NATIVE_FREQUENCY * duration) | 849 | buf = get_mix_insert_pos(); |
842 | // return ; | 850 | } else { |
843 | 851 | buf = (short *)audiobuffer; | |
844 | if (audiobuffer_pos < pcmbuf_unplayed_bytes) | 852 | } |
845 | pos = pcmbuf_size + audiobuffer_pos - pcmbuf_unplayed_bytes; | 853 | while (i++ < samples) |
846 | else | ||
847 | pos = audiobuffer_pos - pcmbuf_unplayed_bytes; | ||
848 | pos /= 2; | ||
849 | |||
850 | duration = NATIVE_FREQUENCY / 1000 * duration; | ||
851 | while (duration-- > 0) | ||
852 | { | 854 | { |
855 | long sample = *buf; | ||
853 | if (state) { | 856 | if (state) { |
854 | buf[pos] = MIN(MAX(buf[pos] + amplitude, -32768), 32767); | 857 | *buf++ = MIN(MAX(sample + amplitude, -32768), 32767); |
855 | if (++pos >= bufsize) | 858 | if (buf > pcmbuf_end) |
856 | pos = 0; | 859 | buf = (short *)audiobuffer; |
857 | buf[pos] = MIN(MAX(buf[pos] + amplitude, -32768), 32767); | 860 | sample = *buf; |
861 | *buf++ = MIN(MAX(sample + amplitude, -32768), 32767); | ||
858 | } else { | 862 | } else { |
859 | buf[pos] = MIN(MAX(buf[pos] - amplitude, -32768), 32767); | 863 | *buf++ = MIN(MAX(sample - amplitude, -32768), 32767); |
860 | if (++pos >= bufsize) | 864 | if (buf > pcmbuf_end) |
861 | pos = 0; | 865 | buf = (short *)audiobuffer; |
862 | buf[pos] = MIN(MAX(buf[pos] - amplitude, -32768), 32767); | 866 | sample = *buf; |
867 | *buf++ = MIN(MAX(sample - amplitude, -32768), 32767); | ||
863 | } | 868 | } |
864 | 869 | ||
865 | if (++count >= interval) | 870 | if (++count >= interval) |
866 | { | 871 | { |
867 | count = 0; | 872 | count = 0; |
868 | if (state) | 873 | state = !state; |
869 | state = 0; | ||
870 | else | ||
871 | state = 1; | ||
872 | } | 874 | } |
873 | pos++; | 875 | if (buf > pcmbuf_end) |
874 | if (pos >= bufsize) | 876 | buf = (short *)audiobuffer; |
875 | pos = 0; | 877 | } |
878 | if (!playing) { | ||
879 | pcm_play_data(NULL, (unsigned char *)audiobuffer, samples * 4); | ||
876 | } | 880 | } |
877 | } | 881 | } |
878 | 882 | ||
@@ -889,19 +893,14 @@ int pcmbuf_mix_usage(void) | |||
889 | 893 | ||
890 | void pcmbuf_reset_mixpos(void) | 894 | void pcmbuf_reset_mixpos(void) |
891 | { | 895 | { |
896 | mixpos = get_mix_insert_pos(); | ||
892 | pcmbuf_mix_used_bytes = 0; | 897 | pcmbuf_mix_used_bytes = 0; |
893 | if (audiobuffer_pos < pcmbuf_unplayed_bytes) | ||
894 | mixpos = pcmbuf_size + audiobuffer_pos - pcmbuf_unplayed_bytes; | ||
895 | else | ||
896 | mixpos = audiobuffer_pos - pcmbuf_unplayed_bytes; | ||
897 | mixpos /= 2; | ||
898 | } | 898 | } |
899 | 899 | ||
900 | void pcmbuf_mix(char *buf, size_t length) | 900 | void pcmbuf_mix(char *buf, size_t length) |
901 | { | 901 | { |
902 | short *ibuf = (short *)buf; | 902 | short *ibuf = (short *)buf; |
903 | short *obuf = (short *)audiobuffer; | 903 | short *pcmbuf_end = (short *)guardbuf; |
904 | size_t bufsize = pcmbuf_size / 2; | ||
905 | 904 | ||
906 | if (pcmbuf_mix_used_bytes == 0) | 905 | if (pcmbuf_mix_used_bytes == 0) |
907 | pcmbuf_reset_mixpos(); | 906 | pcmbuf_reset_mixpos(); |
@@ -910,12 +909,12 @@ void pcmbuf_mix(char *buf, size_t length) | |||
910 | length /= 2; | 909 | length /= 2; |
911 | 910 | ||
912 | while (length-- > 0) { | 911 | while (length-- > 0) { |
913 | obuf[mixpos] = MIN(MAX(obuf[mixpos]/4 + *ibuf, -32768), 32767); | 912 | long sample = *ibuf++; |
914 | 913 | sample += *mixpos >> 2; | |
915 | ibuf++; | 914 | *mixpos++ = MIN(MAX(sample, -32768), 32767); |
916 | mixpos++; | 915 | |
917 | if (mixpos >= bufsize) | 916 | if (mixpos >= pcmbuf_end) |
918 | mixpos = 0; | 917 | mixpos = (short *)audiobuffer; |
919 | } | 918 | } |
920 | } | 919 | } |
921 | 920 | ||
diff --git a/apps/pcmbuf.h b/apps/pcmbuf.h index 555c1bcb33..b659e8fa4e 100644 --- a/apps/pcmbuf.h +++ b/apps/pcmbuf.h | |||
@@ -58,7 +58,6 @@ unsigned int pcmbuf_get_latency(void); | |||
58 | void pcmbuf_set_low_latency(bool state); | 58 | void pcmbuf_set_low_latency(bool state); |
59 | bool pcmbuf_insert_buffer(const char *buf, size_t length); | 59 | bool pcmbuf_insert_buffer(const char *buf, size_t length); |
60 | void pcmbuf_write_complete(size_t length); | 60 | void pcmbuf_write_complete(size_t length); |
61 | void pcmbuf_write_voice(size_t length); | ||
62 | void* pcmbuf_request_buffer(size_t length, size_t *realsize); | 61 | void* pcmbuf_request_buffer(size_t length, size_t *realsize); |
63 | void* pcmbuf_request_voice_buffer(size_t length, size_t *realsize, bool mix); | 62 | void* pcmbuf_request_voice_buffer(size_t length, size_t *realsize, bool mix); |
64 | bool pcmbuf_is_crossfade_enabled(void); | 63 | bool pcmbuf_is_crossfade_enabled(void); |
@@ -66,7 +65,7 @@ void pcmbuf_crossfade_enable(bool on_off); | |||
66 | 65 | ||
67 | int pcmbuf_usage(void); | 66 | int pcmbuf_usage(void); |
68 | int pcmbuf_mix_usage(void); | 67 | int pcmbuf_mix_usage(void); |
69 | void pcmbuf_beep(int frequency, int duration, int amplitude); | 68 | void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude); |
70 | void pcmbuf_reset_mixpos(void); | 69 | void pcmbuf_reset_mixpos(void); |
71 | void pcmbuf_mix(char *buf, size_t length); | 70 | void pcmbuf_mix(char *buf, size_t length); |
72 | 71 | ||