void SoundPool::play(size_t index, float volume) { // TODO: sounds_.end() could be invalidated? auto sound_it = buffers_[index].second; for (size_t i = 0; sound_it == sounds_.end() && i < sounds_.size(); ++i) { auto it = sounds_.begin(); ALenum state; alGetSourcei(*it, AL_SOURCE_STATE, &state); if (state != AL_PLAYING) { sound_it = it; buffers_[index].second = sound_it; alSourcei(*sound_it, AL_BUFFER, buffers_[index].first); break; } move_to_end(it); } if (sound_it != sounds_.end()) { alSourcef(*sound_it, AL_GAIN, volume/100.0f); alSourcePlay(*sound_it); move_to_end(sound_it); } }
TreeIt::TreeIt(const MlSlotList& parent_) : parent(parent_), l1_cur {{0}}, l2_cur{{0}}, last_cur{0} { // not accurate but highly likely for(int i=0; i<100 && buffer.empty(); ++i) fill_buffer(); if (buffer.empty()) move_to_end(); }
TreeIt& TreeIt::operator++() { if(buffer.size() > 1) buffer.pop_back(); else { buffer.clear(); while(buffer.empty() && l1_cur[0] < l1_size) fill_buffer(); if(buffer.empty()) move_to_end(); } return *this; }
os_status osHwiMultiplexedDelete(os_hwi_handle hwi_num, os_hwi_function handler, os_hwi_arg argument) { os_status status = OS_SUCCESS; multiplexed_hwi_t *this_int = NULL, *iterator, *head; #ifdef HWI_ERROR_CHECKING // Can't remove during active hwi - risk of corrupting active list if (g_os_flags & OS_FLG_HWI_ACTIVE) { #ifdef HWI_ERROR_ASSERT OS_ASSERT; #endif /* HWI_ERROR_ASSERT */ RETURN_ERROR(OS_FAIL); } if (hwi_num > OS_INT_LAST) { #ifdef HWI_ERROR_ASSERT OS_ASSERT; #endif /* HWI_ERROR_ASSERT */ RETURN_ERROR(OS_ERR_HWI_INVALID); } if (interrupt_pointer[hwi_num] != osHwiMultiplexedHandler) { #ifdef HWI_ERROR_ASSERT OS_ASSERT; #endif /* HWI_ERROR_ASSERT */ RETURN_ERROR(OS_ERR_HWI_COMMAND_INVALID); } #endif // HWI_ERROR_CHECKING osHwiSwiftDisable(); head = (multiplexed_hwi_t *)interrupt_argument[hwi_num]; for (iterator = head ; iterator != NULL ; iterator = iterator->next) { if ((iterator->argument == argument) && (iterator->handler == handler)) { #ifdef HWI_ERROR_CHECKING if (iterator->valid != TRUE) { #ifdef HWI_ERROR_ASSERT OS_ASSERT; #endif /* HWI_ERROR_ASSERT */ status = OS_ERR_ALREADY_FREE; REPORT_ERROR(status); goto exit_func; } #endif // HWI_ERROR_CHECKING this_int = iterator; this_int->valid = FALSE; /* Put this_int at the end of the list. Ensures requirement * in osHwiMultiplexedHandler() */ // If first in list if (this_int == head) { // If not single entry in list if (this_int->next != NULL) { interrupt_argument[hwi_num] = (os_hwi_arg)(this_int->next); move_to_end(iterator, this_int); } else { setInterruptEnable(hwi_num, FALSE); } } // If not already last in list if (this_int->next != NULL) { iterator = head; while (iterator->next != this_int) { iterator = iterator->next; } iterator->next = this_int->next; move_to_end(iterator, this_int); } break; } } exit_func: osHwiSwiftEnable(); return status; }