void CDxSound::PlaySample(int id,float volume) { PUSH_CODE_MODE; ENTER_MIXED; if(id<=0 || id>=loadedSounds.size() || playingSounds.size()>=maxSounds){ POP_CODE_MODE; return; } const float v = 1.0f - (globalVolume * max(0.0f, min(1.0f, volume))); int num = GetBuf(id,v); if (num == -2) { return; // shutting down } // Restore the buffers if they are lost HRESULT hr; if( FAILED( hr = RestoreBuffers(num) ) ){ POP_CODE_MODE; return; } buffers[num]->SetVolume(int(DSBVOLUME_MIN*v)); buffers[num]->SetPan(0); // if(reset) // buffers[num]->SetCurrentPosition( 0L ); // Play buffer // DWORD dwLooped = loop ? DSBPLAY_LOOPING : 0L; if( FAILED( hr = buffers[num]->Play( 0, 0, 0/*dwLooped*/ ) ) ){ } POP_CODE_MODE; }
void CDxSound::PlaySound(int id,float volume) { PUSH_CODE_MODE; ENTER_MIXED; if(noSound || id<=0 || id>=loadedSounds.size() || playingSounds.size()>=maxSounds){ POP_CODE_MODE; return; } float v=0.2-globalVolume*volume*0.2; HRESULT hr; int num=GetBuf(id,v); // Restore the buffers if they are lost if( FAILED( hr = RestoreBuffers(num) ) ){ POP_CODE_MODE; return; } buffers[num]->SetVolume(DSBVOLUME_MIN*v-100); buffers[num]->SetPan(0); // if(reset) // buffers[num]->SetCurrentPosition( 0L ); // Play buffer // DWORD dwLooped = loop ? DSBPLAY_LOOPING : 0L; if( FAILED( hr = buffers[num]->Play( 0, 0, 0/*dwLooped*/ ) ) ){ } POP_CODE_MODE; }
void CDxSound::PlaySample(int id,const float3& p,float volume) { PUSH_CODE_MODE; ENTER_MIXED; if(id<=0 || id>=loadedSounds.size()){ POP_CODE_MODE; return; } float3 dif=p - camera->pos; float dl=dif.Length(); float pan=dif.dot(camera->right)*DSBPAN_RIGHT/dl; float v=0; if (volume != 0.0f) { v = dl / ((globalVolume + 0.01f) * volume * 2000.0f); } if (v > 0.6f) { POP_CODE_MODE; return; // too quiet } else { v = max(v, (1.0f - globalVolume)); // clamp so that it isn't too loud } // logOutput.Print("%i %i %f",maxSounds,playingSounds.size(),v); if(v>curThreshhold+(wantedSounds-playingSounds.size())/wantedSounds){ POP_CODE_MODE; return; } int num = GetBuf(id,v); if (num == -2) { return; // shutting down } // Restore the buffers if they are lost HRESULT hr; if( FAILED( hr = RestoreBuffers(num) ) ) return; buffers[num]->SetVolume(int(DSBVOLUME_MIN * v - 100)); buffers[num]->SetPan(int(pan)); if( FAILED( hr = buffers[num]->Play( 0, 0, 0/*dwLooped*/ ) ) ){ } POP_CODE_MODE; }
void CGUIShaderDX::ApplyStateBlock(void) { if (!m_bCreated) return; ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); m_vertexShader.BindShader(); pContext->VSSetConstantBuffers(0, 1, &m_pWVPBuffer); m_pixelShader[m_currentShader].BindShader(); pContext->PSSetConstantBuffers(0, 1, &m_pWVPBuffer); pContext->PSSetConstantBuffers(1, 1, &m_pVPBuffer); ID3D11SamplerState* samplers[] = { m_pSampLinear, m_pSampPoint }; pContext->PSSetSamplers(0, ARRAYSIZE(samplers), samplers); RestoreBuffers(); }
/* * バッファを再生する */ static BOOL PlaySoundBuffer(int nBuffer, struct wave *pStr) { HRESULT hRet; int i; assert(pDSBuffer[nBuffer] != NULL); assert(pStream[nBuffer] == NULL); assert(nBuffer >= 0 && nBuffer < MIXER_STREAMS); /* バッファがロストしていれば修復する */ if(!RestoreBuffers(nBuffer)) return FALSE; /* * イベントスレッドと排他制御する * - 停止->再生が即座に行われた場合、停止前の通知で再生後のバッファリング * が行われる恐れがあるので、きちんと排他制御する */ EnterCriticalSection(&StreamCritical); { /* チャネルのストリームをセットする */ pStream[nBuffer] = pStr; /* 終了領域を未定とする */ nPosEndArea[nBuffer] = -1; /* バッファいっぱいに読み込む */ nPosCurArea[nBuffer] = 0; for(i=0; i<BUF_AREAS; i++) WriteNext(nBuffer); } LeaveCriticalSection(&StreamCritical); /* バッファを再生する */ hRet = IDirectSoundBuffer_Play(pDSBuffer[nBuffer], 0, 0, DSBPLAY_LOOPING); if(hRet != DS_OK) return FALSE; return TRUE; }
void CDxSound::PlaySound(int id,const float3& p,float volume) { PUSH_CODE_MODE; ENTER_MIXED; if(noSound || id<=0 || id>=loadedSounds.size()){ POP_CODE_MODE; return; } HRESULT hr; float3 dif=p - camera->pos; float dl=dif.Length(); float pan=dif.dot(camera->right)*DSBPAN_RIGHT/dl; float v=0; if(volume!=0.0f) v=dl/((globalVolume + 0.01f)*volume*2000); if(v>0.6){ POP_CODE_MODE; return; } // info->AddLine("%i %i %f",maxSounds,playingSounds.size(),v); if(v>curThreshhold+(wantedSounds-playingSounds.size())/wantedSounds){ POP_CODE_MODE; return; } int num=GetBuf(id,v); // Restore the buffers if they are lost if( FAILED( hr = RestoreBuffers(num) ) ) return; buffers[num]->SetVolume(DSBVOLUME_MIN*v-100); buffers[num]->SetPan(pan); if( FAILED( hr = buffers[num]->Play( 0, 0, 0/*dwLooped*/ ) ) ){ } POP_CODE_MODE; }
/* * PCMストリームからバッファにデータを読み込む * - イベントスレッドからクリティカルセクション内で呼び出されるので注意 */ static BOOL WriteNext(int nBuffer) { VOID *pBuf[2]; DWORD dwLockedBytes[2]; DWORD dwOffset; HRESULT hRet; int nArea, nSamples; assert(nBuffer >= 0 && nBuffer < MIXER_STREAMS); assert(nPosCurArea[nBuffer] >= 0 && nPosCurArea[nBuffer] < BUF_AREAS); /* 再生が終了した領域(=書き込みする領域)を取得してインクリメントする */ nArea = nPosCurArea[nBuffer]; nPosCurArea[nBuffer] = (nPosCurArea[nBuffer] + 1) % BUF_AREAS; /* バッファをロックする */ dwOffset = (DWORD)nArea * AREA_BYTES; hRet = IDirectSoundBuffer_Lock(pDSBuffer[nBuffer], dwOffset, AREA_BYTES, &pBuf[0], &dwLockedBytes[0], &pBuf[1], &dwLockedBytes[1], 0); switch(hRet) { case DS_OK: assert(pBuf[1] == NULL && dwLockedBytes[1] == 0); break; case DSERR_BUFFERLOST: /* バッファをリストアして再度ロックする */ if(!RestoreBuffers(nBuffer)) return FALSE; hRet = IDirectSoundBuffer_Lock(pDSBuffer[nBuffer], dwOffset, AREA_BYTES, &pBuf[0], &dwLockedBytes[0], &pBuf[1], &dwLockedBytes[1], 0); if (hRet != DS_OK) return FALSE; break; default: return FALSE; } /* 入力データがEOSに達していない場合 */ if(nPosEndArea[nBuffer] == -1) { /* PCMストリームからバッファにコピーする */ nSamples = get_wave_samples(pStream[nBuffer], (uint32_t *)pBuf[0], AREA_SAMPLES); /* 入力が終端に達した場合 */ if(nSamples == 0) { /* 再生終了位置を記憶する */ nPosEndArea[nBuffer] = nArea == 0 ? BUF_AREAS - 1 : nArea - 1; } else if(nSamples != AREA_SAMPLES) { /* バッファの残りをゼロクリアする */ ZeroMemory((char*)pBuf[0] + nSamples * BYTES_PER_SAMPLE, (size_t)(AREA_SAMPLES - nSamples) * BYTES_PER_SAMPLE); /* 再生終了位置を記憶する */ nPosEndArea[nBuffer] = nArea; } } else { /* 入力データがEOSに達している場合、領域をゼロクリアする */ ZeroMemory(pBuf[0], AREA_BYTES); } /* バッファをアンロックする */ hRet = IDirectSoundBuffer_Unlock(pDSBuffer[nBuffer], pBuf[0], dwLockedBytes[0], pBuf[1], dwLockedBytes[1]); if(hRet != DS_OK) return FALSE; return TRUE; }