summaryrefslogtreecommitdiff
path: root/audio/webrtc-audio-processing/files/patch-powerpc64.patch
blob: c7eba0e841cdf775a455058f74aedcfa77a29d70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Modified https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/merge_requests/17/diffs?commit_id=d49a0855a33bb56cc1935642c0d4bf7a3f474fbd for FreeBSD + pffft patch to include altivec.h.
--- webrtc/common_audio/wav_file.cc
+++ webrtc/common_audio/wav_file.cc
@@ -14,6 +14,7 @@
 
 #include <algorithm>
 #include <array>
+#include <sys/endian.h>
 #include <cstdio>
 #include <type_traits>
 #include <utility>
@@ -89,10 +90,6 @@ void WavReader::Reset() {
 
 size_t WavReader::ReadSamples(const size_t num_samples,
                               int16_t* const samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to big-endian when reading from WAV file"
-#endif
-
   size_t num_samples_left_to_read = num_samples;
   size_t next_chunk_start = 0;
   while (num_samples_left_to_read > 0 && num_unread_samples_ > 0) {
@@ -124,15 +121,16 @@ size_t WavReader::ReadSamples(const size_t num_samples,
     num_unread_samples_ -= num_samples_read;
     num_samples_left_to_read -= num_samples_read;
   }
+#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+  for (size_t i = 0; i < num_samples; i++) {
+    samples[i] = bswap16(samples[i]);
+  }
+#endif
 
   return num_samples - num_samples_left_to_read;
 }
 
 size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to big-endian when reading from WAV file"
-#endif
-
   size_t num_samples_left_to_read = num_samples;
   size_t next_chunk_start = 0;
   while (num_samples_left_to_read > 0 && num_unread_samples_ > 0) {
@@ -170,6 +168,12 @@ size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
     num_unread_samples_ -= num_samples_read;
     num_samples_left_to_read -= num_samples_read;
   }
+#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+  // TODO: is this the right place for this?
+  for (size_t i = 0; i < num_samples; i++) {
+    samples[i] = bswap16(samples[i]);
+  }
+#endif
 
   return num_samples - num_samples_left_to_read;
 }
@@ -213,23 +217,33 @@ WavWriter::WavWriter(FileWrapper file,
 }
 
 void WavWriter::WriteSamples(const int16_t* samples, size_t num_samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to little-endian when writing to WAV file"
-#endif
-
   for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
     const size_t num_remaining_samples = num_samples - i;
     const size_t num_samples_to_write =
         std::min(kMaxChunksize, num_remaining_samples);
 
     if (format_ == WavFormat::kWavFormatPcm) {
+#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
       RTC_CHECK(
           file_.Write(&samples[i], num_samples_to_write * sizeof(samples[0])));
+#else
+      std::array<int16_t, kMaxChunksize> converted_samples;
+      for (size_t j = 0; j < num_samples_to_write; ++j) {
+        converted_samples[j] = bswap16(samples[i + j]);
+      }
+      RTC_CHECK(
+          file_.Write(converted_samples.data(),
+                      num_samples_to_write * sizeof(converted_samples[0])));
+#endif
     } else {
       RTC_CHECK_EQ(format_, WavFormat::kWavFormatIeeeFloat);
       std::array<float, kMaxChunksize> converted_samples;
       for (size_t j = 0; j < num_samples_to_write; ++j) {
-        converted_samples[j] = S16ToFloat(samples[i + j]);
+        int16_t sample = samples[i + j];
+#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+        sample = bswap16(sample);
+#endif
+        converted_samples[j] = S16ToFloat(sample);
       }
       RTC_CHECK(
           file_.Write(converted_samples.data(),
@@ -243,10 +257,6 @@ void WavWriter::WriteSamples(const int16_t* samples, size_t num_samples) {
 }
 
 void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to little-endian when writing to WAV file"
-#endif
-
   for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
     const size_t num_remaining_samples = num_samples - i;
     const size_t num_samples_to_write =
@@ -255,7 +265,11 @@ void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
     if (format_ == WavFormat::kWavFormatPcm) {
       std::array<int16_t, kMaxChunksize> converted_samples;
       for (size_t j = 0; j < num_samples_to_write; ++j) {
-        converted_samples[j] = FloatS16ToS16(samples[i + j]);
+        int16_t sample = FloatS16ToS16(samples[i + j]);
+#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+        sample = bswap16(sample);
+#endif
+        converted_samples[j] = sample;
       }
       RTC_CHECK(
           file_.Write(converted_samples.data(),
@@ -264,6 +278,7 @@ void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
       RTC_CHECK_EQ(format_, WavFormat::kWavFormatIeeeFloat);
       std::array<float, kMaxChunksize> converted_samples;
       for (size_t j = 0; j < num_samples_to_write; ++j) {
+        // TODO: is swap needed for big-endian here?
         converted_samples[j] = FloatS16ToFloat(samples[i + j]);
       }
       RTC_CHECK(
-- 
GitLab

--- webrtc/third_party/pffft/src/pffft.c.orig	2022-02-26 18:37:29 UTC
+++ webrtc/third_party/pffft/src/pffft.c
@@ -100,6 +100,7 @@
    Altivec support macros 
 */
 #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
+#include <altivec.h>
 typedef vector float v4sf;
 #  define SIMD_SZ 4
 #  define VZERO() ((vector float) vec_splat_u8(0))