summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Mao <[email protected]>2017-06-24 16:15:31 -0700
committerGitHub <[email protected]>2017-06-24 16:15:31 -0700
commitb8e976d7df5e3cc2337d42dc86223389fc794dbc (patch)
tree2b453843df52fdd4edc84cc6a813b744eb1c1474
parent9c98650f5987e83f250c1e643bbc8c10e5c6d541 (diff)
parent30789342078bd8876351260a4460a400cfbcb6f6 (diff)
Merge pull request #148 from girishpattabiraman/master
Added 32 bit format on Microphone Array 1 & 2 endpoints.
-rw-r--r--audio/sysvad/EndpointsCommon/micarraywavtable.h50
-rw-r--r--audio/sysvad/ToneGenerator.cpp29
2 files changed, 48 insertions, 31 deletions
diff --git a/audio/sysvad/EndpointsCommon/micarraywavtable.h b/audio/sysvad/EndpointsCommon/micarraywavtable.h
index 3b6c2df0..beda8742 100644
--- a/audio/sysvad/EndpointsCommon/micarraywavtable.h
+++ b/audio/sysvad/EndpointsCommon/micarraywavtable.h
@@ -21,8 +21,8 @@ Abstract:
#define MICARRAY_RAW_CHANNELS 2 // Channels for raw mode
#define MICARRAY_PROCESSED_CHANNELS 1 // Channels for default mode
#define MICARRAY_DEVICE_MAX_CHANNELS 2 // Max channels overall
-#define MICARRAY_MIN_BITS_PER_SAMPLE_PCM 16 // Min Bits Per Sample
-#define MICARRAY_MAX_BITS_PER_SAMPLE_PCM 16 // Max Bits Per Sample
+#define MICARRAY_16_BITS_PER_SAMPLE_PCM 16 // 16 Bits Per Sample
+#define MICARRAY_32_BITS_PER_SAMPLE_PCM 32 // 32 Bits Per Sample
#define MICARRAY_RAW_SAMPLE_RATE 48000 // Raw sample rate
#define MICARRAY_PROCESSED_MIN_SAMPLE_RATE 8000 // Min Sample Rate
#define MICARRAY_PROCESSED_MAX_SAMPLE_RATE 48000 // Max Sample Rate
@@ -253,7 +253,7 @@ KSDATAFORMAT_WAVEFORMATEXTENSIBLE MicArrayPinSupportedDeviceFormats[] =
}
},
// 8 - Note the ENDPOINT_MINIPAIR structures for the mic arrays use this last element as the proposed RAW format
- // 48 KHz 16-bit 2 channels
+ // 48 KHz 32-bit 2 channels
{
{
sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
@@ -269,12 +269,12 @@ KSDATAFORMAT_WAVEFORMATEXTENSIBLE MicArrayPinSupportedDeviceFormats[] =
WAVE_FORMAT_EXTENSIBLE,
2,
48000,
- 192000,
- 4,
- 16,
+ 384000,
+ 8,
+ 32,
sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
},
- 16,
+ 32,
0, // No channel configuration for unprocessed mic array
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
}
@@ -398,8 +398,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesRawStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_RAW_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_32_BITS_PER_SAMPLE_PCM,
+ MICARRAY_32_BITS_PER_SAMPLE_PCM,
MICARRAY_RAW_SAMPLE_RATE,
MICARRAY_RAW_SAMPLE_RATE
},
@@ -419,8 +419,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
MICARRAY_PROCESSED_MIN_SAMPLE_RATE,
MICARRAY_PROCESSED_MIN_SAMPLE_RATE
},
@@ -435,8 +435,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
11025,
11025
},
@@ -451,8 +451,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
16000,
16000
},
@@ -467,8 +467,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
22050,
22050
},
@@ -483,8 +483,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
24000,
24000
},
@@ -499,8 +499,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
32000,
32000
},
@@ -515,8 +515,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
44100,
44100
},
@@ -531,8 +531,8 @@ KSDATARANGE_AUDIO MicArrayPinDataRangesProcessedStream[] =
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MICARRAY_PROCESSED_CHANNELS,
- MICARRAY_MIN_BITS_PER_SAMPLE_PCM,
- MICARRAY_MAX_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
+ MICARRAY_16_BITS_PER_SAMPLE_PCM,
MICARRAY_PROCESSED_MAX_SAMPLE_RATE,
MICARRAY_PROCESSED_MAX_SAMPLE_RATE
},
diff --git a/audio/sysvad/ToneGenerator.cpp b/audio/sysvad/ToneGenerator.cpp
index 807c50c3..2a01e49a 100644
--- a/audio/sysvad/ToneGenerator.cpp
+++ b/audio/sysvad/ToneGenerator.cpp
@@ -21,6 +21,14 @@ const double TWO_PI = M_PI * 2;
extern DWORD g_DisableToneGenerator;
//
+// Double to long conversion.
+//
+long ConvertToLong(double Value)
+{
+ return (long)(Value * _I32_MAX);
+};
+
+//
// Double to short conversion.
//
short ConvertToShort(double Value)
@@ -97,11 +105,23 @@ VOID ToneGenerator::InitNewFrame
unsigned char *dataBuffer = reinterpret_cast<unsigned char *>(Frame);
dataBuffer[i] = ConvertToUChar(sinValue);
}
- else // 16 bits per sample
+ else if (m_BitsPerSample == 16)
{
short *dataBuffer = reinterpret_cast<short *>(Frame);
dataBuffer[i] = ConvertToShort(sinValue);
}
+ else if (m_BitsPerSample == 24)
+ {
+ BYTE *dataBuffer = Frame;
+ long val = ConvertToLong(sinValue);
+ val = val >> 8;
+ RtlCopyMemory(dataBuffer, &val, 3);
+ }
+ else if (m_BitsPerSample == 32)
+ {
+ long *dataBuffer = reinterpret_cast<long *>(Frame);
+ dataBuffer[i] = ConvertToLong(sinValue);
+ }
}
m_Theta += m_SampleIncrement;
@@ -120,7 +140,6 @@ VOID ToneGenerator::InitNewFrame
// Buffer - Buffer to hold the samples
// BufferLength - Length of the buffer.
//
-// Note: this function supports 16bit and 8bit samples only.
//
void ToneGenerator::GenerateSine
(
@@ -210,13 +229,11 @@ NTSTATUS ToneGenerator::Init
KFLOATING_SAVE saveData;
//
- // This sample supports PCM 16bit formats only.
+ // This sample supports PCM formats only.
//
if ((WfExt->Format.wFormatTag != WAVE_FORMAT_PCM &&
!(WfExt->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUIDAligned(WfExt->SubFormat, KSDATAFORMAT_SUBTYPE_PCM))) ||
- (WfExt->Format.wBitsPerSample != 16 &&
- WfExt->Format.wBitsPerSample != 8))
+ IsEqualGUIDAligned(WfExt->SubFormat, KSDATAFORMAT_SUBTYPE_PCM))))
{
status = STATUS_NOT_SUPPORTED;
}