123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #define INITGUID
- #include <mmdeviceapi.h>
- #undef INITGUID
- #include <mmreg.h>
- static WAVEFORMATEXTENSIBLE format_24_stereo =
- {
- {
- WAVE_FORMAT_EXTENSIBLE,
- 2,
- 88200,
- 705600,
- 8,
- 32,
- 22,
- },
- 24,
- SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT,
- KSDATAFORMAT_SUBTYPE_PCM
- };
- static WORD BitsPerSampleContainer(int bitspersamp)
- {
- if (bitspersamp <= 8) {
- return 8;
- } else if (bitspersamp <= 16) {
- return 16;
- } else if (bitspersamp <= 24) {
- return 24;
- } else {
- return 32;
- }
- }
- static WORD ChannelMask(int numchannels)
- {
- switch(numchannels) {
- case 1:
- return SPEAKER_FRONT_CENTER;
- case 2:
- return SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT;
- case 4: // quadraphonic
- return SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT;
- case 6: // 5.1
- return SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY;
- default:
- return 0;
- }
- }
- WAVEFORMATEXTENSIBLE WaveFormatForParameters(int samplerate, int numchannels, int bitspersamp)
- {
- WAVEFORMATEXTENSIBLE wave_format;
- wave_format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; /* format type */
- wave_format.Format.nChannels = numchannels; /* number of channels (i.e. mono, stereo...) */
- wave_format.Format.nSamplesPerSec = samplerate; /* sample rate */
- wave_format.Format.nAvgBytesPerSec = BitsPerSampleContainer(bitspersamp) * numchannels * samplerate / 8; /* for buffer estimation */
- wave_format.Format.nBlockAlign = BitsPerSampleContainer(bitspersamp) * numchannels / 8; /* block size of data */
- wave_format.Format.wBitsPerSample = BitsPerSampleContainer(bitspersamp);
- wave_format.Format.cbSize = 22; /* the count in bytes of the size of */
- /* extra information (after cbSize) */
-
- wave_format.Samples.wValidBitsPerSample = bitspersamp;
- wave_format.dwChannelMask = ChannelMask(numchannels);
- wave_format.SubFormat=KSDATAFORMAT_SUBTYPE_PCM;
-
- return wave_format;
- }
|