rockbox/firmware/export/pcm_sampr.h
Solomon Peachy 01650b8bc9 audio: Add support for 192 and 176KHz playback
* SAMPR_CAPS_ALL -> SAMPR_CAPS_ALL_48/96/192
 * All targets claiming SAMPR_CAPS_ALL now get appropriate subset
 * No need to explicitly define HAVE_PLAY_FREQ
 * Rates that are a multiple of 44 or 48KHz can be used for playback

Inspired by a patch by Roman Stolyarov, but substantially rewritten by myself.

Change-Id: Iaca7363521b1cb9921e047ba1004d3cbe9c9c23e
2020-09-30 21:37:11 -04:00

451 lines
12 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Michael Sevakis
*
* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef PCM_SAMPR_H
/* File might be included for CPP config macros only. Allow it to be included
* again for full C declarations. */
#ifndef PCM_SAMPR_CONFIG_ONLY
#define PCM_SAMPR_H
#endif
#ifndef HW_SAMPR_CAPS
#define HW_SAMPR_CAPS SAMPR_CAP_44 /* if not defined, default to 44100 */
#endif
/* These must be macros for comparison with SAMPR_CAP_* flags by the
preprocessor. Add samplerate index in descending order renumbering
the ones later in the list if any */
#define FREQ_192 0
#define FREQ_176 1
#define FREQ_96 2
#define FREQ_88 3
#define FREQ_64 4
#define FREQ_48 5
#define FREQ_44 6
#define FREQ_32 7
#define FREQ_24 8
#define FREQ_22 9
#define FREQ_16 10
#define FREQ_12 11
#define FREQ_11 12
#define FREQ_8 13
#define SAMPR_NUM_FREQ 14
/* sample rate values in HZ */
#define SAMPR_192 192000
#define SAMPR_176 176400
#define SAMPR_96 96000
#define SAMPR_88 88200
#define SAMPR_64 64000
#define SAMPR_48 48000
#define SAMPR_44 44100
#define SAMPR_32 32000
#define SAMPR_24 24000
#define SAMPR_22 22050
#define SAMPR_16 16000
#define SAMPR_12 12000
#define SAMPR_11 11025
#define SAMPR_8 8000
/* sample rate capability bits */
#define SAMPR_CAP_192 (1 << FREQ_192)
#define SAMPR_CAP_176 (1 << FREQ_176)
#define SAMPR_CAP_96 (1 << FREQ_96)
#define SAMPR_CAP_88 (1 << FREQ_88)
#define SAMPR_CAP_64 (1 << FREQ_64)
#define SAMPR_CAP_48 (1 << FREQ_48)
#define SAMPR_CAP_44 (1 << FREQ_44)
#define SAMPR_CAP_32 (1 << FREQ_32)
#define SAMPR_CAP_24 (1 << FREQ_24)
#define SAMPR_CAP_22 (1 << FREQ_22)
#define SAMPR_CAP_16 (1 << FREQ_16)
#define SAMPR_CAP_12 (1 << FREQ_12)
#define SAMPR_CAP_11 (1 << FREQ_11)
#define SAMPR_CAP_8 (1 << FREQ_8)
#define SAMPR_CAP_ALL_192 (SAMPR_CAP_192 | SAMPR_CAP_176 | \
SAMPR_CAP_96 | SAMPR_CAP_88 | SAMPR_CAP_64 | \
SAMPR_CAP_48 | SAMPR_CAP_44 | SAMPR_CAP_32 | \
SAMPR_CAP_24 | SAMPR_CAP_22 | SAMPR_CAP_16 | \
SAMPR_CAP_12 | SAMPR_CAP_11 | SAMPR_CAP_8)
#define SAMPR_CAP_ALL_96 (SAMPR_CAP_96 | SAMPR_CAP_88 | SAMPR_CAP_64 | \
SAMPR_CAP_48 | SAMPR_CAP_44 | SAMPR_CAP_32 | \
SAMPR_CAP_24 | SAMPR_CAP_22 | SAMPR_CAP_16 | \
SAMPR_CAP_12 | SAMPR_CAP_11 | SAMPR_CAP_8)
#define SAMPR_CAP_ALL_48 (SAMPR_CAP_48 | SAMPR_CAP_44 | SAMPR_CAP_32 | \
SAMPR_CAP_24 | SAMPR_CAP_22 | SAMPR_CAP_16 | \
SAMPR_CAP_12 | SAMPR_CAP_11 | SAMPR_CAP_8)
/* List of sampling rates that are good enough for most purposes. */
#define SAMPR_CAP_ALL_GE_22 (SAMPR_CAP_192 | SAMPR_CAP_176 | \
SAMPR_CAP_96 | SAMPR_CAP_88 | SAMPR_CAP_64 | \
SAMPR_CAP_48 | SAMPR_CAP_44 | SAMPR_CAP_32 | \
SAMPR_CAP_24 | SAMPR_CAP_22)
#ifndef PCM_SAMPR_CONFIG_ONLY
/* Master list of all "standard" rates supported. */
extern const unsigned long audio_master_sampr_list[SAMPR_NUM_FREQ];
#endif /* PCM_SAMPR_CONFIG_ONLY */
/** Hardware sample rates **/
#ifndef PCM_SAMPR_CONFIG_ONLY
/* Enumeration of supported frequencies where 0 is the highest rate
supported and REC_NUM_FREQUENCIES is the number available */
enum hw_freq_indexes
{
__HW_FREQ_START_INDEX = -1, /* Make sure first in list is 0 */
/* 192000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_192) /* Macros and enums for each FREQ: */
HW_FREQ_192, /* Index in enumeration */
#define HW_HAVE_192 /* Defined if this FREQ is defined */
#define HW_HAVE_192_(...) __VA_ARGS__ /* Output its parameters for this FREQ */
#else
#define HW_HAVE_192_(...) /* Discards its parameters for this FREQ */
#endif
/* 176400 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_176)
HW_FREQ_176,
#define HW_HAVE_176
#define HW_HAVE_176_(...) __VA_ARGS__
#else
#define HW_HAVE_176_(...)
#endif
/* 96000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_96)
HW_FREQ_96,
#define HW_HAVE_96
#define HW_HAVE_96_(...) __VA_ARGS__
#else
#define HW_HAVE_96_(...)
#endif
/* 88200 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_88)
HW_FREQ_88,
#define HW_HAVE_88
#define HW_HAVE_88_(...) __VA_ARGS__
#else
#define HW_HAVE_88_(...)
#endif
/* 64000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_64)
HW_FREQ_64,
#define HW_HAVE_64
#define HW_HAVE_64_(...) __VA_ARGS__
#else
#define HW_HAVE_64_(...)
#endif
/* 48000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_48)
HW_FREQ_48,
#define HW_HAVE_48
#define HW_HAVE_48_(...) __VA_ARGS__
#else
#define HW_HAVE_48_(...)
#endif
/* 44100 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_44)
HW_FREQ_44,
#define HW_HAVE_44
#define HW_HAVE_44_(...) __VA_ARGS__
#else
#define HW_HAVE_44_(...)
#endif
/* 32000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_32)
HW_FREQ_32,
#define HW_HAVE_32
#define HW_HAVE_32_(...) __VA_ARGS__
#else
#define HW_HAVE_32_(...)
#endif
/* 24000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_24)
HW_FREQ_24,
#define HW_HAVE_24
#define HW_HAVE_24_(...) __VA_ARGS__
#else
#define HW_HAVE_24_(...)
#endif
/* 22050 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_22)
HW_FREQ_22,
#define HW_HAVE_22
#define HW_HAVE_22_(...) __VA_ARGS__
#else
#define HW_HAVE_22_(...)
#endif
/* 16000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_16)
HW_FREQ_16,
#define HW_HAVE_16
#define HW_HAVE_16_(...) __VA_ARGS__
#else
#define HW_HAVE_16_(...)
#endif
/* 12000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_12)
HW_FREQ_12,
#define HW_HAVE_12
#define HW_HAVE_12_(...) __VA_ARGS__
#else
#define HW_HAVE_12_(...)
#endif
/* 11025 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_11)
HW_FREQ_11,
#define HW_HAVE_11
#define HW_HAVE_11_(...) __VA_ARGS__
#else
#define HW_HAVE_11_(...)
#endif
/* 8000 */
#if (HW_SAMPR_CAPS & SAMPR_CAP_8 )
HW_FREQ_8,
#define HW_HAVE_8
#define HW_HAVE_8_(...) __VA_ARGS__
#else
#define HW_HAVE_8_(...)
#endif
HW_NUM_FREQ,
}; /* enum hw_freq_indexes */
/* list of hardware sample rates */
extern const unsigned long hw_freq_sampr[HW_NUM_FREQ];
#endif /* PCM_SAMPR_CONFIG_ONLY */
#if HW_SAMPR_CAPS & SAMPR_CAP_44
#define HW_FREQ_DEFAULT HW_FREQ_44
#define HW_SAMPR_DEFAULT SAMPR_44
#elif HW_SAMPR_CAPS & SAMPR_CAP_48
#define HW_FREQ_DEFAULT HW_FREQ_48
#define HW_SAMPR_DEFAULT SAMPR_48
#else
#error "Neither 48 or 44KHz supported?"
#endif
#if HW_SAMPR_CAPS & SAMPR_CAP_192
# define HW_SAMPR_MAX SAMPR_192
#elif HW_SAMPR_CAPS & SAMPR_CAP_176
# define HW_SAMPR_MAX SAMPR_176
#elif HW_SAMPR_CAPS & SAMPR_CAP_96
# define HW_SAMPR_MAX SAMPR_96
#elif HW_SAMPR_CAPS & SAMPR_CAP_88
# define HW_SAMPR_MAX SAMPR_88
#elif HW_SAMPR_CAPS & SAMPR_CAP_64
# define HW_SAMPR_MAX SAMPR_64
#elif HW_SAMPR_CAPS & SAMPR_CAP_48
# define HW_SAMPR_MAX SAMPR_48
#else
# define HW_SAMPR_MAX SAMPR_44
#endif
#if HW_SAMPR_CAPS & SAMPR_CAP_8
# define HW_SAMPR_MIN SAMPR_8
#elif HW_SAMPR_CAPS & SAMPR_CAP_11
# define HW_SAMPR_MIN SAMPR_11
#elif HW_SAMPR_CAPS & SAMPR_CAP_12
# define HW_SAMPR_MIN SAMPR_12
#elif HW_SAMPR_CAPS & SAMPR_CAP_16
# define HW_SAMPR_MIN SAMPR_16
#elif HW_SAMPR_CAPS & SAMPR_CAP_22
# define HW_SAMPR_MIN SAMPR_22
#elif HW_SAMPR_CAPS & SAMPR_CAP_24
# define HW_SAMPR_MIN SAMPR_24
#elif HW_SAMPR_CAPS & SAMPR_CAP_32
# define HW_SAMPR_MIN SAMPR_32
#else
# define HW_SAMPR_MIN SAMPR_44
#endif
#define HW_SAMPR_CAPS_QUAL (HW_SAMPR_CAPS & SAMPR_CAP_ALL_GE_22)
#if HW_SAMPR_CAPS_QUAL & SAMPR_CAP_22
# define HW_SAMPR_MIN_GE_22 SAMPR_22
#elif HW_SAMPR_CAPS_QUAL & SAMPR_CAP_24
# define HW_SAMPR_MIN_GE_22 SAMPR_24
#elif HW_SAMPR_CAPS_QUAL & SAMPR_CAP_32
# define HW_SAMPR_MIN_GE_22 SAMPR_32
#else
# define HW_SAMPR_MIN_GE_22 SAMPR_44
#endif
#ifdef HAVE_RECORDING
#ifndef PCM_SAMPR_CONFIG_ONLY
/* Enumeration of supported frequencies where 0 is the highest rate
supported and REC_NUM_FREQUENCIES is the number available */
enum rec_freq_indexes
{
__REC_FREQ_START_INDEX = -1, /* Make sure first in list is 0 */
/* 96000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_96) /* Macros and enums for each FREQ: */
REC_FREQ_96, /* Index in enumeration */
#define REC_HAVE_96 /* Defined if this FREQ is defined */
#define REC_HAVE_96_(...) __VA_ARGS__ /* Output its parameters for this FREQ */
#else
#define REC_HAVE_96_(...) /* Discards its parameters for this FREQ */
#endif
/* 88200 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_88)
REC_FREQ_88,
#define REC_HAVE_88
#define REC_HAVE_88_(...) __VA_ARGS__
#else
#define REC_HAVE_88_(...)
#endif
/* 64000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_64)
REC_FREQ_64,
#define REC_HAVE_64
#define REC_HAVE_64_(...) __VA_ARGS__
#else
#define REC_HAVE_64_(...)
#endif
/* 48000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_48)
REC_FREQ_48,
#define REC_HAVE_48
#define REC_HAVE_48_(...) __VA_ARGS__
#else
#define REC_HAVE_48_(...)
#endif
/* 44100 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_44)
REC_FREQ_44,
#define REC_HAVE_44
#define REC_HAVE_44_(...) __VA_ARGS__
#else
#define REC_HAVE_44_(...)
#endif
/* 32000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_32)
REC_FREQ_32,
#define REC_HAVE_32
#define REC_HAVE_32_(...) __VA_ARGS__
#else
#define REC_HAVE_32_(...)
#endif
/* 24000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_24)
REC_FREQ_24,
#define REC_HAVE_24
#define REC_HAVE_24_(...) __VA_ARGS__
#else
#define REC_HAVE_24_(...)
#endif
/* 22050 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_22)
REC_FREQ_22,
#define REC_HAVE_22
#define REC_HAVE_22_(...) __VA_ARGS__
#else
#define REC_HAVE_22_(...)
#endif
/* 16000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_16)
REC_FREQ_16,
#define REC_HAVE_16
#define REC_HAVE_16_(...) __VA_ARGS__
#else
#define REC_HAVE_16_(...)
#endif
/* 12000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_12)
REC_FREQ_12,
#define REC_HAVE_12
#define REC_HAVE_12_(...) __VA_ARGS__
#else
#define REC_HAVE_12_(...)
#endif
/* 11025 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_11)
REC_FREQ_11,
#define REC_HAVE_11
#define REC_HAVE_11_(...) __VA_ARGS__
#else
#define REC_HAVE_11_(...)
#endif
/* 8000 */
#if (REC_SAMPR_CAPS & SAMPR_CAP_8 )
REC_FREQ_8,
#define REC_HAVE_8
#define REC_HAVE_8_(...) __VA_ARGS__
#else
#define REC_HAVE_8_(...)
#endif
REC_NUM_FREQ,
}; /* enum rec_freq_indexes */
/* List of recording supported sample rates (set or subset of master list) */
extern const unsigned long rec_freq_sampr[REC_NUM_FREQ];
#endif /* PCM_SAMPR_CONFIG_ONLY */
/* Default to 44.1kHz if not otherwise specified */
#ifndef REC_FREQ_DEFAULT
#define REC_FREQ_DEFAULT REC_FREQ_44
#endif
#ifndef REC_SAMPR_DEFAULT
#define REC_SAMPR_DEFAULT SAMPR_44
#endif
#define HW_SAMPR_RESET 0
#define REC_FREQ_CFG_VAL_LIST &REC_HAVE_96_(",96") REC_HAVE_88_(",88") \
REC_HAVE_64_(",64") REC_HAVE_48_(",48") \
REC_HAVE_44_(",44") REC_HAVE_32_(",32") \
REC_HAVE_24_(",24") REC_HAVE_22_(",22") \
REC_HAVE_16_(",16") REC_HAVE_12_(",12") \
REC_HAVE_11_(",11") REC_HAVE_8_(",8")[1]
#endif /* HAVE_RECORDING */
#ifdef CONFIG_SAMPR_TYPES
#define SAMPR_TYPE_MASK (0xff << 24)
#define SAMPR_TYPE_PLAY (0x00 << 24)
#ifdef HAVE_RECORDING
#define SAMPR_TYPE_REC (0x01 << 24)
#endif
#ifndef PCM_SAMPR_CONFIG_ONLY
unsigned int pcm_sampr_to_hw_sampr(unsigned int samplerate,
unsigned int type);
#endif
#else /* ndef CONFIG_SAMPR_TYPES */
/* Types are ignored and == 0 */
#define SAMPR_TYPE_PLAY 0
#ifdef HAVE_RECORDING
#define SAMPR_TYPE_REC 0
#endif
#endif /* CONFIG_SAMPR_TYPES */
#endif /* PCM_SAMPR_H */