diff options
author | Max Kellermann <max@duempel.org> | 2013-12-22 23:24:42 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-12-23 10:35:21 +0100 |
commit | 6d21b9448a0d337b449ce22f68802670c911ca40 (patch) | |
tree | 38b79404023ada218be99623b86e2bcf66fd474e /src/pcm/Volume.hxx | |
parent | 2d1a3073f63604a452e559ff8322520af98a4b65 (diff) | |
download | mpd-6d21b9448a0d337b449ce22f68802670c911ca40.tar.gz mpd-6d21b9448a0d337b449ce22f68802670c911ca40.tar.xz mpd-6d21b9448a0d337b449ce22f68802670c911ca40.zip |
pcm/PcmVolume: rename to Volume.cxx
Diffstat (limited to 'src/pcm/Volume.hxx')
-rw-r--r-- | src/pcm/Volume.hxx | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/pcm/Volume.hxx b/src/pcm/Volume.hxx new file mode 100644 index 000000000..52102a294 --- /dev/null +++ b/src/pcm/Volume.hxx @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2003-2013 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_PCM_VOLUME_HXX +#define MPD_PCM_VOLUME_HXX + +#include "PcmPrng.hxx" +#include "AudioFormat.hxx" + +#include <stdint.h> +#include <stddef.h> + +/** + * Number of fractional bits for a fixed-point volume value. + */ +static constexpr unsigned PCM_VOLUME_BITS = 10; + +/** + * This value means "100% volume". + */ +static constexpr unsigned PCM_VOLUME_1 = 1024; +static constexpr int PCM_VOLUME_1S = PCM_VOLUME_1; + +struct AudioFormat; + +/** + * Converts a float value (0.0 = silence, 1.0 = 100% volume) to an + * integer volume value (1000 = 100%). + */ +static inline int +pcm_float_to_volume(float volume) +{ + return volume * PCM_VOLUME_1 + 0.5; +} + +static inline float +pcm_volume_to_float(int volume) +{ + return (float)volume / (float)PCM_VOLUME_1; +} + +/** + * Returns the next volume dithering number, between -511 and +511. + * This number is taken from a global PRNG, see pcm_prng(). + */ +static inline int +pcm_volume_dither(void) +{ + static unsigned long state; + uint32_t r; + + r = state = pcm_prng(state); + + return (r & 511) - ((r >> 9) & 511); +} + +/** + * Adjust the volume of the specified PCM buffer. + * + * @param buffer the PCM buffer + * @param length the length of the PCM buffer + * @param format the sample format of the PCM buffer + * @param volume the volume between 0 and #PCM_VOLUME_1 + * @return true on success, false if the audio format is not supported + */ +bool +pcm_volume(void *buffer, size_t length, + SampleFormat format, + int volume); + +#endif |