Exemplo n.º 1
0
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 : &params.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;
}
Exemplo n.º 2
0
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);
}