bool Player::Initialize(const SlotInitParams slotsIP[], const int sgCount_) { player_data_s &pd = *(player_data_s *)&data; //Инициализация Direct Sound if (FAILED(DirectSoundCreate8(params.device == DEFAULT_DEVICE ? nullptr : ¶ms.device, &pd.pDS, nullptr))) { Shutdown(); return false; } //Cоздаем скрытое окно.. if (params.hwnd == nullptr) { WNDCLASSW wc = {0, DefWindowProc, 0, 0, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"s3hwndclass"}; RegisterClassW(&wc); pd.hwnd = CreateWindowW(wc.lpszClassName, L"", WS_POPUP, 0, 0, 0, 0, nullptr, nullptr, wc.hInstance, nullptr); } //.. для того, чтобы установить Cooperative Level if (FAILED(pd.pDS->SetCooperativeLevel(params.hwnd ? (HWND)params.hwnd : pd.hwnd, DSSCL_PRIORITY))) {Shutdown(); return false;} //Получаем listener-а (для этого приходится создать primary buffer) DSBUFFERDESC dsbd = {sizeof(DSBUFFERDESC), DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D|DSBCAPS_CTRLVOLUME}; if (SUCCEEDED(pd.pDS->CreateSoundBuffer(&dsbd, &pd.dsPrimaryBuffer, nullptr))) { pd.dsPrimaryBuffer->QueryInterface(MY_IID_IDirectSound3DListener, (LPVOID*)&pd.dsListener); //Также устанавливаем формат primary buffer-а (почему-то по умолчанию там 8бит 22КГц) WAVEFORMATEX wf = BuildWaveFormat(params.channels, params.sampleRate, params.bitsPerSample); pd.dsPrimaryBuffer->SetFormat(&wf); } else {Shutdown(); return false;} //Инициализация внутренних частей s3 if (pd.soundGroups == nullptr) { pd.sgCount = sgCount_; pd.soundGroups = new SoundGroupSlots[pd.sgCount]; for (int i=0; i<pd.sgCount; i++) pd.soundGroups[i].initialize(slotsIP[i]); pd.gdecoder = new Decoder; } pd.hQuitEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); pd.hUpdateThread = CreateThread(nullptr, 0, &UpdateThreadProc, this, 0, nullptr); SetThreadPriority(pd.hUpdateThread, THREAD_PRIORITY_HIGHEST); return true; }
WavSink::WavSink(FILE *fp, uint64_t duration, const SampleFormat &format, const std::vector<uint32_t> *chanmap) : m_file(fp) { WAVEFORMATEXTENSIBLE wfx; BuildWaveFormat(format, chanmap, &wfx); uint32_t hdrsize = wfx.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE ? sizeof wfx : offsetof(WAVEFORMATEX, cbSize); uint64_t datasize_ = duration * format.bytesPerFrame(); uint64_t riffsize_ = hdrsize + datasize_ + 20; uint32_t datasize = static_cast<uint32_t>(datasize_); // XXX uint32_t riffsize = static_cast<uint32_t>(riffsize_); // XXX write("RIFF", 4); write(&riffsize, 4); write("WAVEfmt ", 8); write(&hdrsize, 4); write(&wfx, hdrsize); write("data", 4); write(&datasize, 4); }