00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PCM_VOLUME_H
00021 #define PCM_VOLUME_H
00022
00023 #include "pcm_prng.h"
00024 #include "audio_format.h"
00025
00026 #include <stdint.h>
00027 #include <stdbool.h>
00028
00029 enum {
00031 PCM_VOLUME_1 = 1024,
00032 };
00033
00034 struct audio_format;
00035
00040 static inline int
00041 pcm_float_to_volume(float volume)
00042 {
00043 return volume * PCM_VOLUME_1 + 0.5;
00044 }
00045
00046 static inline float
00047 pcm_volume_to_float(int volume)
00048 {
00049 return (float)volume / (float)PCM_VOLUME_1;
00050 }
00051
00056 static inline int
00057 pcm_volume_dither(void)
00058 {
00059 static unsigned long state;
00060 uint32_t r;
00061
00062 r = state = pcm_prng(state);
00063
00064 return (r & 511) - ((r >> 9) & 511);
00065 }
00066
00076 bool
00077 pcm_volume(void *buffer, size_t length,
00078 enum sample_format format,
00079 int volume);
00080
00081 #endif