Support all audio formats
This commit is contained in:
+2
-2
@@ -4,7 +4,7 @@ project(pipedal
|
|||||||
DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi"
|
DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi"
|
||||||
HOMEPAGE_URL "https://rerdavies.github.io/pipedal"
|
HOMEPAGE_URL "https://rerdavies.github.io/pipedal"
|
||||||
)
|
)
|
||||||
set (DISPLAY_VERSION "v1.0.16")
|
set (DISPLAY_VERSION "v1.0.17")
|
||||||
|
|
||||||
set (CMAKE_INSTALL_PREFIX "/usr/")
|
set (CMAKE_INSTALL_PREFIX "/usr/")
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ set(CPACK_DEBIAN_PACKAGE_SECTION sound)
|
|||||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||||
set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
|
set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
|
||||||
#set(CPACK_DEBIAN_PACKAGE_DEPENDS "jackd2, hostapd, dnsmasq" )
|
#set(CPACK_DEBIAN_PACKAGE_DEPENDS "jackd2, hostapd, dnsmasq" )
|
||||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "hostapd, dnsmasq authbind" )
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "hostapd, dnsmasq, authbind" )
|
||||||
#set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
|
#set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
|
||||||
set(CPACK_PACKAGING_INSTALL_PREFIX /usr)
|
set(CPACK_PACKAGING_INSTALL_PREFIX /usr)
|
||||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
<img src='docs/GithubBanner.png' width="100%" /><br/>
|
<img src='docs/GithubBanner.png' width="100%" /><br/>
|
||||||
|
|
||||||
Download: <a href='https://rerdavies.github.io/pipedal/download.html'>v1.0.16</a>
|
Download: <a href='https://rerdavies.github.io/pipedal/download.html'>v1.0.17</a>
|
||||||
|
|
||||||
Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal).
|
Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal).
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
Architecture: arm64
|
Architecture: arm64
|
||||||
Depends: libstdc++6 (>= 9), libasound2 (>= 1.0.16), libc6 (>= 2.34), libgcc-s1 (>= 4.0), libjack-jackd2-0 (>= 1.9.10+20150825) | libjack-0.125, liblilv-0-0 (>= 0.22.0~dfsg0), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libstdc++6 (>= 11), libsystemd0
|
Depends: libstdc++6 (>= 9), libasound2 (>= 1.0.17), libc6 (>= 2.34), libgcc-s1 (>= 4.0), libjack-jackd2-0 (>= 1.9.10+20150825) | libjack-0.125, liblilv-0-0 (>= 0.22.0~dfsg0), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libstdc++6 (>= 11), libsystemd0
|
||||||
Description: IoT guitar effect for Raspberry Pi
|
Description: IoT guitar effect for Raspberry Pi
|
||||||
IoT guitar effect pedal for Raspberry Pi, with phone-friendly web interface.
|
IoT guitar effect pedal for Raspberry Pi, with phone-friendly web interface.
|
||||||
Homepage: https://github.com/rerdavies/pipedal
|
Homepage: https://github.com/rerdavies/pipedal
|
||||||
@@ -9,6 +9,6 @@ Package: pipedal
|
|||||||
Pre-Depends: hostapd;authbind
|
Pre-Depends: hostapd;authbind
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Section: sound
|
Section: sound
|
||||||
Version: 1.0.16
|
Version: 1.0.17
|
||||||
Installed-Size: 15147
|
Installed-Size: 15147
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -13,14 +13,14 @@ page_icon: img/Install4.jpg
|
|||||||
|
|
||||||
Download the most recent Debian (.deb) package for your platform:
|
Download the most recent Debian (.deb) package for your platform:
|
||||||
|
|
||||||
- [Ubuntu/Raspberry Pi OS (64-bit) v1.0.16](https://github.com/rerdavies/pipedal/releases/download/v1.0.16/pipedal_1.0.16_arm64.deb)
|
- [Ubuntu/Raspberry Pi OS (64-bit) v1.0.17](https://github.com/rerdavies/pipedal/releases/download/v1.0.17/pipedal_1.0.17_arm64.deb)
|
||||||
|
|
||||||
Install the package by running
|
Install the package by running
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt update
|
sudo apt update
|
||||||
cd ~/Downloads
|
cd ~/Downloads
|
||||||
sudo dpkg --install pipedal_1.0.16_arm64.deb
|
sudo dpkg --install pipedal_1.0.17_arm64.deb
|
||||||
```
|
```
|
||||||
On Raspberry Pi OS, if you have a graphical desktop installed, you can also install the package by double-clicking on the downloaded package in the File Manager.
|
On Raspberry Pi OS, if you have a graphical desktop installed, you can also install the package by double-clicking on the downloaded package in the File Manager.
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
Download the most recent Debian (.deb) package for your platform:
|
Download the most recent Debian (.deb) package for your platform:
|
||||||
|
|
||||||
- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v1.0.16/pipedal_1.0.16_arm64.deb) v1.0.16
|
- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v1.0.17/pipedal_1.0.17_arm64.deb) v1.0.17
|
||||||
|
|
||||||
Install the package by running
|
Install the package by running
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt update
|
sudo apt update
|
||||||
cd ~/Downloads
|
cd ~/Downloads
|
||||||
sudo apt-get install ./pipedal_1.0.16_arm64.deb
|
sudo apt-get install ./pipedal_1.0.17_arm64.deb
|
||||||
```
|
```
|
||||||
|
|
||||||
Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation.
|
Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation.
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<img src="GithubBanner.png" width="100%"/>
|
<img src="GithubBanner.png" width="100%"/>
|
||||||
<a href="Installing.html"><i>v1.0.16</i></a>
|
<a href="Installing.html"><i>v1.0.17</i></a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+356
-5
@@ -88,17 +88,17 @@ namespace pipedal
|
|||||||
|
|
||||||
static AudioFormat leFormats[]{
|
static AudioFormat leFormats[]{
|
||||||
{"32-bit float little-endian", SND_PCM_FORMAT_FLOAT_LE},
|
{"32-bit float little-endian", SND_PCM_FORMAT_FLOAT_LE},
|
||||||
{"24-bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE},
|
|
||||||
{"32-bit integer little-endian", SND_PCM_FORMAT_S32_LE},
|
{"32-bit integer little-endian", SND_PCM_FORMAT_S32_LE},
|
||||||
{"24-bit little-endian", SND_PCM_FORMAT_S24_LE},
|
{"24-bit little-endian", SND_PCM_FORMAT_S24_LE},
|
||||||
|
{"24-bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE},
|
||||||
{"16-bit little-endian", SND_PCM_FORMAT_S16_LE},
|
{"16-bit little-endian", SND_PCM_FORMAT_S16_LE},
|
||||||
|
|
||||||
};
|
};
|
||||||
static AudioFormat beFormats[]{
|
static AudioFormat beFormats[]{
|
||||||
{"32-bit float big-endian", SND_PCM_FORMAT_FLOAT_BE},
|
{"32-bit float big-endian", SND_PCM_FORMAT_FLOAT_BE},
|
||||||
{"24-bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE},
|
|
||||||
{"32-bit integer big-endian", SND_PCM_FORMAT_S32_BE},
|
{"32-bit integer big-endian", SND_PCM_FORMAT_S32_BE},
|
||||||
{"24-bit big-endian", SND_PCM_FORMAT_S24_BE},
|
{"24-bit big-endian", SND_PCM_FORMAT_S24_BE},
|
||||||
|
{"24-bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE},
|
||||||
{"16-bit big-endian", SND_PCM_FORMAT_S16_BE},
|
{"16-bit big-endian", SND_PCM_FORMAT_S16_BE},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -491,6 +491,47 @@ namespace pipedal
|
|||||||
snd_pcm_dump(playbackHandle, snd_output);
|
snd_pcm_dump(playbackHandle, snd_output);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t EndianSwap(int32_t v)
|
||||||
|
{
|
||||||
|
int32_t b0 = v & 0xFF;
|
||||||
|
int32_t b1 = (v >> 8) & 0xFF;
|
||||||
|
int32_t b2 = (v >> 16) & 0xFF;
|
||||||
|
int32_t b3 = (v >> 24) & 0xFF;
|
||||||
|
|
||||||
|
return (b0 << 24) | (b1 << 16) | (b2 << 8) | (b3);
|
||||||
|
}
|
||||||
|
int16_t EndianSwap(int16_t v)
|
||||||
|
{
|
||||||
|
int16_t b0 = v & 0xFF;
|
||||||
|
int16_t b1 = (v >> 8) & 0xFF;
|
||||||
|
|
||||||
|
return (b0 << 8) | (b1);
|
||||||
|
}
|
||||||
|
void EndianSwap(float*p,float v_)
|
||||||
|
{
|
||||||
|
int32_t v = EndianSwap(*(int32_t*)&v_);
|
||||||
|
*(int32_t*)p = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CopyCaptureFloatBe(size_t frames)
|
||||||
|
{
|
||||||
|
int32_t *p = (int32_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = EndianSwap(*p);
|
||||||
|
++p;
|
||||||
|
|
||||||
|
*(int32_t*)(buffers[channel]+frame) = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CopyCaptureFloatLe(size_t frames)
|
void CopyCaptureFloatLe(size_t frames)
|
||||||
{
|
{
|
||||||
float *p = (float *)rawCaptureBuffer;
|
float *p = (float *)rawCaptureBuffer;
|
||||||
@@ -507,6 +548,39 @@ namespace pipedal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CopyCaptureS16Le(size_t frames)
|
||||||
|
{
|
||||||
|
int16_t *p = (int16_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (std::numeric_limits<int16_t>::max() + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int16_t v = *p++;
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyCaptureS16Be(size_t frames)
|
||||||
|
{
|
||||||
|
int16_t *p = (int16_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (std::numeric_limits<int16_t>::max() + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int16_t v = EndianSwap(*p++);
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CopyCaptureS32Le(size_t frames)
|
void CopyCaptureS32Le(size_t frames)
|
||||||
{
|
{
|
||||||
int32_t *p = (int32_t *)rawCaptureBuffer;
|
int32_t *p = (int32_t *)rawCaptureBuffer;
|
||||||
@@ -523,6 +597,128 @@ namespace pipedal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void CopyCaptureS24_3Le(size_t frames)
|
||||||
|
{
|
||||||
|
uint8_t *p = (uint8_t*)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (std::numeric_limits<int32_t>::max() + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = (p[0] << 8)+(p[1] << 16) | (p[2] << 24);
|
||||||
|
p += 3;
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyCaptureS24_3Be(size_t frames)
|
||||||
|
{
|
||||||
|
uint8_t *p = (uint8_t*)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (std::numeric_limits<int32_t>::max() + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = (p[2] << 8)+(p[1] << 16) | (p[0] << 24);
|
||||||
|
p += 3;
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyCaptureS24Le(size_t frames)
|
||||||
|
{
|
||||||
|
int32_t *p = (int32_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (0x00FFFFFFL + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = *p++;
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyCaptureS24Be(size_t frames)
|
||||||
|
{
|
||||||
|
int32_t *p = (int32_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (0x00FFFFFFL + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = EndianSwap(*p++);
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyCaptureS32Be(size_t frames)
|
||||||
|
{
|
||||||
|
int32_t *p = (int32_t *)rawCaptureBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->captureBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
constexpr float scale = 1.0f / (std::numeric_limits<int32_t>::max() + 1L);
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
int32_t v = EndianSwap(*p++);
|
||||||
|
buffers[channel][frame] = scale * v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS16Le(size_t frames)
|
||||||
|
{
|
||||||
|
int16_t *p = (int16_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = std::numeric_limits<int16_t>::max();
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
*p++ = (int16_t)(scale * v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS16Be(size_t frames)
|
||||||
|
{
|
||||||
|
int16_t *p = (int16_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = std::numeric_limits<int16_t>::max();
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
*p++ = EndianSwap((int16_t)(scale * v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
void CopyPlaybackS32Le(size_t frames)
|
void CopyPlaybackS32Le(size_t frames)
|
||||||
{
|
{
|
||||||
int32_t *p = (int32_t *)rawPlaybackBuffer;
|
int32_t *p = (int32_t *)rawPlaybackBuffer;
|
||||||
@@ -537,12 +733,123 @@ namespace pipedal
|
|||||||
float v = buffers[channel][frame];
|
float v = buffers[channel][frame];
|
||||||
if (v > 1.0f)
|
if (v > 1.0f)
|
||||||
v = 1.0f;
|
v = 1.0f;
|
||||||
if (v < -1.0f)
|
else if (v < -1.0f)
|
||||||
v = -1.0f;
|
v = -1.0f;
|
||||||
*p++ = (int32_t)(scale * v);
|
*p++ = (int32_t)(scale * v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void CopyPlaybackS24Le(size_t frames)
|
||||||
|
{
|
||||||
|
// 24 bits in low bits of an int32_t.
|
||||||
|
|
||||||
|
int32_t *p = (int32_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = 0x00FFFFFF;
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
*p++ = (int32_t)(scale * v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS24Be(size_t frames)
|
||||||
|
{
|
||||||
|
// 24 bits in low bits of an int32_t.
|
||||||
|
|
||||||
|
int32_t *p = (int32_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = 0x00FFFFFF;
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
*p++ = EndianSwap((int32_t)(scale * v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS32Be(size_t frames)
|
||||||
|
{
|
||||||
|
int32_t *p = (int32_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = std::numeric_limits<int32_t>::max();
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
*p++ = EndianSwap((int32_t)(scale * v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS24_3Be(size_t frames)
|
||||||
|
{
|
||||||
|
uint8_t *p = (uint8_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = std::numeric_limits<int32_t>::max();
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
int32_t iValue = (int32_t)(scale * v);
|
||||||
|
p[0] = (uint8_t)(iValue >> 24);
|
||||||
|
p[1] = (uint8_t)(iValue >> 16);
|
||||||
|
p[2] = (uint8_t)(iValue >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CopyPlaybackS24_3Le(size_t frames)
|
||||||
|
{
|
||||||
|
uint8_t *p = (uint8_t *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->playbackChannels;
|
||||||
|
constexpr float scale = std::numeric_limits<int32_t>::max();
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
if (v > 1.0f)
|
||||||
|
v = 1.0f;
|
||||||
|
else if (v < -1.0f)
|
||||||
|
v = -1.0f;
|
||||||
|
int32_t iValue = (int32_t)(scale * v);
|
||||||
|
p[0] = (uint8_t)(iValue >> 8);
|
||||||
|
p[1] = (uint8_t)(iValue >> 16);
|
||||||
|
p[2] = (uint8_t)(iValue >> 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CopyPlaybackFloatLe(size_t frames)
|
void CopyPlaybackFloatLe(size_t frames)
|
||||||
{
|
{
|
||||||
float *p = (float *)rawPlaybackBuffer;
|
float *p = (float *)rawPlaybackBuffer;
|
||||||
@@ -558,6 +865,22 @@ namespace pipedal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void CopyPlaybackFloatBe(size_t frames)
|
||||||
|
{
|
||||||
|
float *p = (float *)rawPlaybackBuffer;
|
||||||
|
|
||||||
|
std::vector<float *> &buffers = this->playbackBuffers;
|
||||||
|
int channels = this->captureChannels;
|
||||||
|
for (size_t frame = 0; frame < frames; ++frame)
|
||||||
|
{
|
||||||
|
for (int channel = 0; channel < channels; ++channel)
|
||||||
|
{
|
||||||
|
float v = buffers[channel][frame];
|
||||||
|
EndianSwap(p,v);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
void AllocateBuffers(std::vector<float *> &buffers, size_t n)
|
void AllocateBuffers(std::vector<float *> &buffers, size_t n)
|
||||||
{
|
{
|
||||||
buffers.resize(n);
|
buffers.resize(n);
|
||||||
@@ -709,6 +1032,7 @@ namespace pipedal
|
|||||||
|
|
||||||
snd_pcm_format_t captureFormat;
|
snd_pcm_format_t captureFormat;
|
||||||
snd_pcm_hw_params_get_format(captureHwParams, &captureFormat);
|
snd_pcm_hw_params_get_format(captureHwParams, &captureFormat);
|
||||||
|
copyInputFn = nullptr;
|
||||||
|
|
||||||
switch (captureFormat)
|
switch (captureFormat)
|
||||||
{
|
{
|
||||||
@@ -717,6 +1041,7 @@ namespace pipedal
|
|||||||
copyInputFn = &AlsaDriverImpl::CopyCaptureFloatLe;
|
copyInputFn = &AlsaDriverImpl::CopyCaptureFloatLe;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_3LE:
|
case SND_PCM_FORMAT_S24_3LE:
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS24_3Le;
|
||||||
captureSampleSize = 3;
|
captureSampleSize = 3;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S32_LE:
|
case SND_PCM_FORMAT_S32_LE:
|
||||||
@@ -725,27 +1050,39 @@ namespace pipedal
|
|||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_LE:
|
case SND_PCM_FORMAT_S24_LE:
|
||||||
captureSampleSize = 4;
|
captureSampleSize = 4;
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS24Le;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S16_LE:
|
case SND_PCM_FORMAT_S16_LE:
|
||||||
captureSampleSize = 2;
|
captureSampleSize = 2;
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS16Le;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_FLOAT_BE:
|
case SND_PCM_FORMAT_FLOAT_BE:
|
||||||
|
captureSampleSize = 4;
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureFloatBe;
|
||||||
captureSampleSize = 4;
|
captureSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_3BE:
|
case SND_PCM_FORMAT_S24_3BE:
|
||||||
captureSampleSize = 3;
|
captureSampleSize = 3;
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS24_3Be;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S32_BE:
|
case SND_PCM_FORMAT_S32_BE:
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS32Be;
|
||||||
captureSampleSize = 4;
|
captureSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_BE:
|
case SND_PCM_FORMAT_S24_BE:
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS24Be;
|
||||||
captureSampleSize = 4;
|
captureSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S16_BE:
|
case SND_PCM_FORMAT_S16_BE:
|
||||||
|
copyInputFn = &AlsaDriverImpl::CopyCaptureS16Be;
|
||||||
captureSampleSize = 2;
|
captureSampleSize = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw PiPedalStateException("Invalid format.");
|
break;
|
||||||
|
}
|
||||||
|
if (copyInputFn == nullptr)
|
||||||
|
{
|
||||||
|
throw PiPedalStateException(SS("Audio input format not supported. (" << captureFormat << ")"));
|
||||||
}
|
}
|
||||||
captureFrameSize = captureSampleSize * captureChannels;
|
captureFrameSize = captureSampleSize * captureChannels;
|
||||||
rawCaptureBuffer = new uint8_t[captureFrameSize * bufferSize];
|
rawCaptureBuffer = new uint8_t[captureFrameSize * bufferSize];
|
||||||
@@ -756,6 +1093,7 @@ namespace pipedal
|
|||||||
snd_pcm_format_t playbackFormat;
|
snd_pcm_format_t playbackFormat;
|
||||||
snd_pcm_hw_params_get_format(playbackHwParams, &playbackFormat);
|
snd_pcm_hw_params_get_format(playbackHwParams, &playbackFormat);
|
||||||
|
|
||||||
|
copyOutputFn = nullptr;
|
||||||
switch (playbackFormat)
|
switch (playbackFormat)
|
||||||
{
|
{
|
||||||
case SND_PCM_FORMAT_FLOAT_LE:
|
case SND_PCM_FORMAT_FLOAT_LE:
|
||||||
@@ -763,6 +1101,7 @@ namespace pipedal
|
|||||||
copyOutputFn = &AlsaDriverImpl::CopyPlaybackFloatLe;
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackFloatLe;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_3LE:
|
case SND_PCM_FORMAT_S24_3LE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS24_3Le;
|
||||||
playbackSampleSize = 3;
|
playbackSampleSize = 3;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S32_LE:
|
case SND_PCM_FORMAT_S32_LE:
|
||||||
@@ -770,29 +1109,41 @@ namespace pipedal
|
|||||||
playbackSampleSize = 4;
|
playbackSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_LE:
|
case SND_PCM_FORMAT_S24_LE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS24Le;
|
||||||
playbackSampleSize = 4;
|
playbackSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S16_LE:
|
case SND_PCM_FORMAT_S16_LE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS16Le;
|
||||||
playbackSampleSize = 2;
|
playbackSampleSize = 2;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_FLOAT_BE:
|
case SND_PCM_FORMAT_FLOAT_BE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackFloatBe;
|
||||||
playbackSampleSize = 4;
|
playbackSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_3BE:
|
case SND_PCM_FORMAT_S24_3BE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS24_3Be;
|
||||||
playbackSampleSize = 3;
|
playbackSampleSize = 3;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S32_BE:
|
case SND_PCM_FORMAT_S32_BE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS32Be;
|
||||||
playbackSampleSize = 4;
|
playbackSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S24_BE:
|
case SND_PCM_FORMAT_S24_BE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS24Be;
|
||||||
playbackSampleSize = 4;
|
playbackSampleSize = 4;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_FORMAT_S16_BE:
|
case SND_PCM_FORMAT_S16_BE:
|
||||||
|
copyOutputFn = &AlsaDriverImpl::CopyPlaybackS16Be;
|
||||||
playbackSampleSize = 2;
|
playbackSampleSize = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw PiPedalStateException("Invalid format.");
|
break;
|
||||||
}
|
}
|
||||||
|
if (copyOutputFn == nullptr)
|
||||||
|
{
|
||||||
|
throw PiPedalStateException(SS("Unsupported audio output format. (" << playbackFormat << ")"));
|
||||||
|
}
|
||||||
|
|
||||||
playbackFrameSize = playbackSampleSize * playbackChannels;
|
playbackFrameSize = playbackSampleSize * playbackChannels;
|
||||||
rawPlaybackBuffer = new uint8_t[playbackFrameSize * bufferSize];
|
rawPlaybackBuffer = new uint8_t[playbackFrameSize * bufferSize];
|
||||||
memset(rawPlaybackBuffer, 0, playbackFrameSize * bufferSize);
|
memset(rawPlaybackBuffer, 0, playbackFrameSize * bufferSize);
|
||||||
|
|||||||
Reference in New Issue
Block a user