From: 
Subject: Debian changes

The Debian packaging of python-webrtc-noise-gain is maintained in git, using a workflow
similar to the one described in dgit-maint-merge(7).
The Debian delta is represented by this one combined patch; there isn't a
patch queue that can be represented as a quilt series.

A detailed breakdown of the changes is available from their canonical
representation -- git commits in the packaging repository.
For example, to see the changes made by the Debian maintainer in the first
upload of upstream version 1.2.3, you could use:

    % git clone https://git.dgit.debian.org/python-webrtc-noise-gain
    % cd python-webrtc-noise-gain
    % git log --oneline 1.2.3..debian/1.2.3-1 -- . ':!debian'

(If you have dgit, use `dgit clone python-webrtc-noise-gain`, rather than plain `git clone`.)

We don't use debian/source/options single-debian-patch because it has bugs.
Therefore, NMUs etc. may nevertheless have made additional patches.

---

diff --git a/setup.py b/setup.py
index 2afd6d3..1c8b0d3 100644
--- a/setup.py
+++ b/setup.py
@@ -1,5 +1,6 @@
 import os
 import platform
+import sys
 from pathlib import Path
 
 from setuptools import Extension, setup
@@ -354,7 +355,16 @@ system_cflags = []
 
 # Architecture detection was removed from rtc_base/system/arch.h
 # This was causing errors when cross-compiling on Github.
-machine_cflags = ["-DWEBRTC_ARCH_LITTLE_ENDIAN"]
+if sys.byteorder == "little":
+    machine_cflags = ["-DWEBRTC_ARCH_LITTLE_ENDIAN"]
+elif sys.byteorder == "big":
+    machine_cflags = ["-DWEBRTC_ARCH_BIG_ENDIAN"]
+else:
+    raise ValueError(f"Unsupported byte order: {sys.byteorder}")
+
+arch_bits_cflags = [
+    "-DWEBRTC_ARCH_64_BITS" if sys.maxsize > 2**32 else "-DWEBRTC_ARCH_32_BITS"
+]
 
 have_neon = True
 have_avx2 = False  # disabled for older CPUs
@@ -480,7 +490,9 @@ elif machine in ("armv6", "armhf", "armv6l", "armv5tel"):
         "-DPFFFT_SIMD_DISABLE",
     ]
 else:
-    raise ValueError(f"Unsupported machine: {machine}")
+    machine_cflags += arch_bits_cflags + [
+        "-DPFFFT_SIMD_DISABLE",
+    ]
 
 # -----------------------------------------------------------------------------
 
diff --git a/webrtc-audio-processing/webrtc-audio-processing-1/api/task_queue/task_queue_base.h b/webrtc-audio-processing/webrtc-audio-processing-1/api/task_queue/task_queue_base.h
index 90b1efd..63526a7 100644
--- a/webrtc-audio-processing/webrtc-audio-processing-1/api/task_queue/task_queue_base.h
+++ b/webrtc-audio-processing/webrtc-audio-processing-1/api/task_queue/task_queue_base.h
@@ -10,6 +10,7 @@
 #ifndef API_TASK_QUEUE_TASK_QUEUE_BASE_H_
 #define API_TASK_QUEUE_TASK_QUEUE_BASE_H_
 
+#include <cstdint>
 #include <memory>
 
 #include "api/task_queue/queued_task.h"
diff --git a/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_file.cc b/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_file.cc
index e49126f..9b66b7d 100644
--- a/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_file.cc
+++ b/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_file.cc
@@ -15,6 +15,8 @@
 #include <algorithm>
 #include <array>
 #include <cstdio>
+#include <cstdint>
+#include <cstring>
 #include <type_traits>
 #include <utility>
 
@@ -63,6 +65,43 @@ class WavHeaderFileReader : public WavHeaderReader {
 
 constexpr size_t kMaxChunksize = 4096;
 
+uint16_t ByteSwap(uint16_t value) {
+  return static_cast<uint16_t>((value >> 8) | (value << 8));
+}
+
+uint32_t ByteSwap(uint32_t value) {
+  return (value >> 24) | ((value >> 8) & 0x0000ff00) |
+         ((value << 8) & 0x00ff0000) | (value << 24);
+}
+
+int16_t FromLittleEndian(int16_t value) {
+#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
+  return value;
+#else
+  return static_cast<int16_t>(ByteSwap(static_cast<uint16_t>(value)));
+#endif
+}
+
+int16_t ToLittleEndian(int16_t value) {
+  return FromLittleEndian(value);
+}
+
+float FromLittleEndian(float value) {
+#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
+  return value;
+#else
+  uint32_t repr;
+  memcpy(&repr, &value, sizeof(repr));
+  repr = ByteSwap(repr);
+  memcpy(&value, &repr, sizeof(value));
+  return value;
+#endif
+}
+
+float ToLittleEndian(float value) {
+  return FromLittleEndian(value);
+}
+
 }  // namespace
 
 WavReader::WavReader(const std::string& filename)
@@ -89,10 +128,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) {
@@ -107,13 +142,18 @@ size_t WavReader::ReadSamples(const size_t num_samples,
       num_samples_read = num_bytes_read / sizeof(samples_to_convert[0]);
 
       for (size_t j = 0; j < num_samples_read; ++j) {
-        samples[next_chunk_start + j] = FloatToS16(samples_to_convert[j]);
+        samples[next_chunk_start + j] =
+            FloatToS16(FromLittleEndian(samples_to_convert[j]));
       }
     } else {
       RTC_CHECK_EQ(format_, WavFormat::kWavFormatPcm);
       num_bytes_read = file_.Read(&samples[next_chunk_start],
                                   chunk_size * sizeof(samples[0]));
       num_samples_read = num_bytes_read / sizeof(samples[0]);
+      for (size_t j = 0; j < num_samples_read; ++j) {
+        samples[next_chunk_start + j] =
+            FromLittleEndian(samples[next_chunk_start + j]);
+      }
     }
     RTC_CHECK(num_samples_read == 0 || (num_bytes_read % num_samples_read) == 0)
         << "Corrupt file: file ended in the middle of a sample.";
@@ -129,10 +169,6 @@ size_t WavReader::ReadSamples(const size_t num_samples,
 }
 
 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) {
@@ -148,7 +184,7 @@ size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
 
       for (size_t j = 0; j < num_samples_read; ++j) {
         samples[next_chunk_start + j] =
-            static_cast<float>(samples_to_convert[j]);
+            static_cast<float>(FromLittleEndian(samples_to_convert[j]));
       }
     } else {
       RTC_CHECK_EQ(format_, WavFormat::kWavFormatIeeeFloat);
@@ -158,7 +194,7 @@ size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
 
       for (size_t j = 0; j < num_samples_read; ++j) {
         samples[next_chunk_start + j] =
-            FloatToFloatS16(samples[next_chunk_start + j]);
+            FloatToFloatS16(FromLittleEndian(samples[next_chunk_start + j]));
       }
     }
     RTC_CHECK(num_samples_read == 0 || (num_bytes_read % num_samples_read) == 0)
@@ -213,23 +249,24 @@ 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) {
+      std::array<int16_t, kMaxChunksize> converted_samples;
+      for (size_t j = 0; j < num_samples_to_write; ++j) {
+        converted_samples[j] = ToLittleEndian(samples[i + j]);
+      }
       RTC_CHECK(
-          file_.Write(&samples[i], num_samples_to_write * sizeof(samples[0])));
+          file_.Write(converted_samples.data(),
+                      num_samples_to_write * sizeof(converted_samples[0])));
     } 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]);
+        converted_samples[j] = ToLittleEndian(S16ToFloat(samples[i + j]));
       }
       RTC_CHECK(
           file_.Write(converted_samples.data(),
@@ -243,10 +280,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 +288,7 @@ 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]);
+        converted_samples[j] = ToLittleEndian(FloatS16ToS16(samples[i + j]));
       }
       RTC_CHECK(
           file_.Write(converted_samples.data(),
@@ -264,7 +297,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) {
-        converted_samples[j] = FloatS16ToFloat(samples[i + j]);
+        converted_samples[j] = ToLittleEndian(FloatS16ToFloat(samples[i + j]));
       }
       RTC_CHECK(
           file_.Write(converted_samples.data(),
diff --git a/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_header.cc b/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_header.cc
index d3dca90..a99c93e 100644
--- a/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_header.cc
+++ b/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/wav_header.cc
@@ -15,6 +15,7 @@
 #include "common_audio/wav_header.h"
 
 #include <cstring>
+#include <cstdint>
 #include <limits>
 #include <string>
 
@@ -26,10 +27,6 @@
 namespace webrtc {
 namespace {
 
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Code not working properly for big endian platforms."
-#endif
-
 #pragma pack(2)
 struct ChunkHeader {
   uint32_t ID;
@@ -110,10 +107,49 @@ struct WavHeaderIeeeFloat {
 static_assert(sizeof(WavHeaderIeeeFloat) == kIeeeFloatWavHeaderSize,
               "no padding in header");
 
+uint16_t ByteSwap(uint16_t value) {
+  return static_cast<uint16_t>((value >> 8) | (value << 8));
+}
+
+uint32_t ByteSwap(uint32_t value) {
+  return (value >> 24) | ((value >> 8) & 0x0000ff00) |
+         ((value << 8) & 0x00ff0000) | (value << 24);
+}
+
+uint16_t ToLittleEndian(uint16_t value) {
+#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
+  return value;
+#else
+  return ByteSwap(value);
+#endif
+}
+
+uint32_t ToLittleEndian(uint32_t value) {
+#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
+  return value;
+#else
+  return ByteSwap(value);
+#endif
+}
+
+uint16_t FromLittleEndian(uint16_t value) {
+  return ToLittleEndian(value);
+}
+
+uint32_t FromLittleEndian(uint32_t value) {
+  return ToLittleEndian(value);
+}
+
 uint32_t PackFourCC(char a, char b, char c, char d) {
+#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
   uint32_t packed_value =
       static_cast<uint32_t>(a) | static_cast<uint32_t>(b) << 8 |
       static_cast<uint32_t>(c) << 16 | static_cast<uint32_t>(d) << 24;
+#else
+  uint32_t packed_value =
+      static_cast<uint32_t>(a) << 24 | static_cast<uint32_t>(b) << 16 |
+      static_cast<uint32_t>(c) << 8 | static_cast<uint32_t>(d);
+#endif
   return packed_value;
 }
 
@@ -172,6 +208,7 @@ bool FindWaveChunk(ChunkHeader* chunk_header,
     if (readable->Read(chunk_header, sizeof(*chunk_header)) !=
         sizeof(*chunk_header))
       return false;  // EOF.
+    chunk_header->Size = FromLittleEndian(chunk_header->Size);
     if (ReadFourCC(chunk_header->ID) == sought_chunk_id)
       return true;  // Sought chunk found.
     // Ignore current chunk by skipping its payload.
@@ -186,14 +223,21 @@ bool ReadFmtChunkData(FmtPcmSubchunk* fmt_subchunk, WavHeaderReader* readable) {
       kFmtPcmSubchunkSize)
     return false;
   const uint32_t fmt_size = fmt_subchunk->header.Size;
+  fmt_subchunk->AudioFormat = FromLittleEndian(fmt_subchunk->AudioFormat);
+  fmt_subchunk->NumChannels = FromLittleEndian(fmt_subchunk->NumChannels);
+  fmt_subchunk->SampleRate = FromLittleEndian(fmt_subchunk->SampleRate);
+  fmt_subchunk->ByteRate = FromLittleEndian(fmt_subchunk->ByteRate);
+  fmt_subchunk->BlockAlign = FromLittleEndian(fmt_subchunk->BlockAlign);
+  fmt_subchunk->BitsPerSample = FromLittleEndian(fmt_subchunk->BitsPerSample);
   if (fmt_size != kFmtPcmSubchunkSize) {
     // There is an optional two-byte extension field permitted to be present
     // with PCM, but which must be zero.
-    int16_t ext_size;
+    uint16_t ext_size;
     if (kFmtPcmSubchunkSize + sizeof(ext_size) != fmt_size)
       return false;
     if (readable->Read(&ext_size, sizeof(ext_size)) != sizeof(ext_size))
       return false;
+    ext_size = FromLittleEndian(ext_size);
     if (ext_size != 0)
       return false;
   }
@@ -213,18 +257,25 @@ void WritePcmWavHeader(size_t num_channels,
   const size_t bytes_in_payload = bytes_per_sample * num_samples;
 
   header.riff.header.ID = PackFourCC('R', 'I', 'F', 'F');
-  header.riff.header.Size = RiffChunkSize(bytes_in_payload, *header_size);
+  header.riff.header.Size =
+      ToLittleEndian(RiffChunkSize(bytes_in_payload, *header_size));
   header.riff.Format = PackFourCC('W', 'A', 'V', 'E');
   header.fmt.header.ID = PackFourCC('f', 'm', 't', ' ');
-  header.fmt.header.Size = kFmtPcmSubchunkSize;
-  header.fmt.AudioFormat = MapWavFormatToHeaderField(WavFormat::kWavFormatPcm);
-  header.fmt.NumChannels = static_cast<uint16_t>(num_channels);
-  header.fmt.SampleRate = sample_rate;
-  header.fmt.ByteRate = ByteRate(num_channels, sample_rate, bytes_per_sample);
-  header.fmt.BlockAlign = BlockAlign(num_channels, bytes_per_sample);
-  header.fmt.BitsPerSample = static_cast<uint16_t>(8 * bytes_per_sample);
+  header.fmt.header.Size = ToLittleEndian(kFmtPcmSubchunkSize);
+  header.fmt.AudioFormat =
+      ToLittleEndian(MapWavFormatToHeaderField(WavFormat::kWavFormatPcm));
+  header.fmt.NumChannels =
+      ToLittleEndian(static_cast<uint16_t>(num_channels));
+  header.fmt.SampleRate = ToLittleEndian(static_cast<uint32_t>(sample_rate));
+  header.fmt.ByteRate =
+      ToLittleEndian(ByteRate(num_channels, sample_rate, bytes_per_sample));
+  header.fmt.BlockAlign =
+      ToLittleEndian(BlockAlign(num_channels, bytes_per_sample));
+  header.fmt.BitsPerSample =
+      ToLittleEndian(static_cast<uint16_t>(8 * bytes_per_sample));
   header.data.header.ID = PackFourCC('d', 'a', 't', 'a');
-  header.data.header.Size = static_cast<uint32_t>(bytes_in_payload);
+  header.data.header.Size =
+      ToLittleEndian(static_cast<uint32_t>(bytes_in_payload));
 
   // Do an extra copy rather than writing everything to buf directly, since buf
   // might not be correctly aligned.
@@ -244,23 +295,30 @@ void WriteIeeeFloatWavHeader(size_t num_channels,
   const size_t bytes_in_payload = bytes_per_sample * num_samples;
 
   header.riff.header.ID = PackFourCC('R', 'I', 'F', 'F');
-  header.riff.header.Size = RiffChunkSize(bytes_in_payload, *header_size);
+  header.riff.header.Size =
+      ToLittleEndian(RiffChunkSize(bytes_in_payload, *header_size));
   header.riff.Format = PackFourCC('W', 'A', 'V', 'E');
   header.fmt.header.ID = PackFourCC('f', 'm', 't', ' ');
-  header.fmt.header.Size = kFmtIeeeFloatSubchunkSize;
+  header.fmt.header.Size = ToLittleEndian(kFmtIeeeFloatSubchunkSize);
   header.fmt.AudioFormat =
-      MapWavFormatToHeaderField(WavFormat::kWavFormatIeeeFloat);
-  header.fmt.NumChannels = static_cast<uint16_t>(num_channels);
-  header.fmt.SampleRate = sample_rate;
-  header.fmt.ByteRate = ByteRate(num_channels, sample_rate, bytes_per_sample);
-  header.fmt.BlockAlign = BlockAlign(num_channels, bytes_per_sample);
-  header.fmt.BitsPerSample = static_cast<uint16_t>(8 * bytes_per_sample);
-  header.fmt.ExtensionSize = 0;
+      ToLittleEndian(MapWavFormatToHeaderField(WavFormat::kWavFormatIeeeFloat));
+  header.fmt.NumChannels =
+      ToLittleEndian(static_cast<uint16_t>(num_channels));
+  header.fmt.SampleRate = ToLittleEndian(static_cast<uint32_t>(sample_rate));
+  header.fmt.ByteRate =
+      ToLittleEndian(ByteRate(num_channels, sample_rate, bytes_per_sample));
+  header.fmt.BlockAlign =
+      ToLittleEndian(BlockAlign(num_channels, bytes_per_sample));
+  header.fmt.BitsPerSample =
+      ToLittleEndian(static_cast<uint16_t>(8 * bytes_per_sample));
+  header.fmt.ExtensionSize = ToLittleEndian(static_cast<uint16_t>(0));
   header.fact.header.ID = PackFourCC('f', 'a', 'c', 't');
-  header.fact.header.Size = 4;
-  header.fact.SampleLength = static_cast<uint32_t>(num_channels * num_samples);
+  header.fact.header.Size = ToLittleEndian(static_cast<uint32_t>(4));
+  header.fact.SampleLength =
+      ToLittleEndian(static_cast<uint32_t>(num_channels * num_samples));
   header.data.header.ID = PackFourCC('d', 'a', 't', 'a');
-  header.data.header.Size = static_cast<uint32_t>(bytes_in_payload);
+  header.data.header.Size =
+      ToLittleEndian(static_cast<uint32_t>(bytes_in_payload));
 
   // Do an extra copy rather than writing everything to buf directly, since buf
   // might not be correctly aligned.
@@ -385,6 +443,7 @@ bool ReadWavHeader(WavHeaderReader* readable,
   // Read RIFF chunk.
   if (readable->Read(&header.riff, sizeof(header.riff)) != sizeof(header.riff))
     return false;
+  header.riff.header.Size = FromLittleEndian(header.riff.header.Size);
   if (ReadFourCC(header.riff.header.ID) != "RIFF")
     return false;
   if (ReadFourCC(header.riff.Format) != "WAVE")
