| | 12 | /***************************************************************************** |
| | 13 | * Useful macros |
| | 14 | *****************************************************************************/ |
| | 15 | #ifndef WAVE_FORMAT_IEEE_FLOAT |
| | 16 | # define WAVE_FORMAT_IEEE_FLOAT 0x0003 |
| | 17 | #endif |
| | 18 | |
| | 19 | #ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF |
| | 20 | # define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 |
| | 21 | #endif |
| | 22 | |
| | 23 | #ifndef WAVE_FORMAT_EXTENSIBLE |
| | 24 | #define WAVE_FORMAT_EXTENSIBLE 0xFFFE |
| | 25 | #endif |
| | 26 | |
| | 27 | #ifndef _WAVEFORMATEXTENSIBLE_ |
| | 28 | typedef struct { |
| | 29 | WAVEFORMATEX Format; |
| | 30 | union { |
| | 31 | WORD wValidBitsPerSample; /* bits of precision */ |
| | 32 | WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */ |
| | 33 | WORD wReserved; /* If neither applies, set to zero. */ |
| | 34 | } Samples; |
| | 35 | DWORD dwChannelMask; /* which channels are */ |
| | 36 | /* present in stream */ |
| | 37 | GUID SubFormat; |
| | 38 | } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; |
| | 39 | #endif |
| | 40 | |
| | 41 | DEFINE_GUID( _KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, WAVE_FORMAT_IEEE_FLOAT, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); |
| | 42 | DEFINE_GUID( _KSDATAFORMAT_SUBTYPE_PCM, WAVE_FORMAT_PCM, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); |
| | 43 | DEFINE_GUID( _KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF, WAVE_FORMAT_DOLBY_AC3_SPDIF, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); |
| | 44 | |
| 115 | | WAVEFORMATEX wf; |
| 116 | | wf.wFormatTag = WAVE_FORMAT_PCM; |
| 117 | | wf.nChannels = audio_channels; |
| 118 | | wf.nSamplesPerSec = audio_samplerate; |
| 119 | | wf.wBitsPerSample = audio_bits; |
| 120 | | wf.nBlockAlign = wf.wBitsPerSample / 8 * wf.nChannels; |
| 121 | | wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec; |
| 122 | | wf.cbSize = 0; |
| | 150 | WAVEFORMATEXTENSIBLE wf; |
| | 151 | wf.Format.wFormatTag = |
| | 152 | (m_UseSPDIF) ? WAVE_FORMAT_DOLBY_AC3_SPDIF : WAVE_FORMAT_PCM; |
| | 153 | wf.Format.nChannels = audio_channels; |
| | 154 | wf.Format.nSamplesPerSec = audio_samplerate; |
| | 155 | wf.Format.nBlockAlign = audio_bytes_per_sample; |
| | 156 | wf.Format.nAvgBytesPerSec = |
| | 157 | wf.Format.nSamplesPerSec * wf.Format.nBlockAlign; |
| | 158 | wf.Format.wBitsPerSample = audio_bits; |
| | 159 | wf.Samples.wValidBitsPerSample = wf.Format.wBitsPerSample; |
| | 160 | wf.SubFormat = |
| | 161 | (m_UseSPDIF) ? _KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF : _KSDATAFORMAT_SUBTYPE_PCM; |
| 154 | | while (m_nPkts >= kPacketCnt) |
| | 209 | // Linux and Windows have different 5.1 channel order conventions |
| | 210 | const uint kReorder[6] = {0,1,4,5,2,3}; |
| | 211 | int abytes = audio_bits / 8; |
| | 212 | unsigned char p_tmp[24]; |
| | 213 | unsigned char *obuf = buffer; |
| | 214 | for(int i = 0; i < size / audio_channels / abytes; i++) |
| | 215 | { |
| | 216 | for(int j = 0; j < audio_channels; j++) |
| | 217 | { |
| | 218 | for(int k = 0; k < abytes; k++) |
| | 219 | { |
| | 220 | p_tmp[abytes * kReorder[j] + k] = buffer[abytes * j + k]; |
| | 221 | } |
| | 222 | } |
| | 223 | memcpy(buffer, p_tmp, abytes * audio_channels); |
| | 224 | buffer += abytes * audio_channels; |
| | 225 | } |
| | 226 | buffer = obuf; |
| | 227 | } |
| | 228 | |
| | 229 | if (InterlockedIncrement(&m_nPkts) > kPacketCnt) |
| | 230 | { |
| | 231 | while (m_nPkts > kPacketCnt) |