Я использую Fmod Studio с банками в своем проекте, и я столкнулся с проблемой при приостановке и возобновлении звука. Я загружаю свой звук в качестве банка (то есть экземпляр события FMOD Studio) и использую метод SetPaUsed (TRUE), чтобы приостановить аудио. Однако, пока звук приостанавливается, внутренняя временная шкала события продолжает продвигаться. Это означает, что когда я отказался от события, позиция воспроизведения прыгает вперед (например, с 100 мс до 150 мс), хотя аудио должно было быть приостановлено. < /P>
< /p>
Вот что происходит: позиция песни отображается в верхнем левом углу. Когда я нажимаю на паузу на 2241 мс, а затем возобновите, позиция песни возвращается около 200 мс < /p>
Здесь код из app.cpp: < /p>
#include "pch.hpp"
#define RAYGUI_IMPLEMENTATION
#include "include/raygui.h"
#include "raymath.h"
#include "include/App.hpp"
#include "include/Audio.hpp"
#include "include/Constants.hpp"
#include "include/Conductor.hpp"
#include "fmod.hpp"
bool paused = true;
bool songLoad = false;
int columFuck = 0;
App::App(unsigned int Width, unsigned int Height, const std::string& title)
{
InitWindow(Width, Height, title.c_str());
SetTargetFPS(60);
Audio::Init();
Conductor::Init(77, 4, 4, Constants::SoundPath + "Episode Songs.bank", "e1-s1");
columFuck = static_cast(std::ceil(Conductor::SongMaxLenght / (Conductor::MSPerBeat / 4.0f)));
m_LinePosition = 100.f;
m_MainCamera.target = { 0.f, m_LinePosition };
m_MainCamera.rotation = 0.f;
m_MainCamera.zoom = 1.f;
m_MainCamera.offset = { 0.f , 100.f };
}
void App::Update()
{
Audio::Update();
Conductor::Update();
if(IsKeyPressed(KEY_SPACE))
{
paused = !paused;
Conductor::SetPause(paused);
}
m_MainCamera.target = { 0.f, m_LinePosition };
if (IsKeyPressed('Q'))
Conductor::SetPosition(Conductor::SongMaxLenght - 2000);
if (Conductor::SongPosition >= Conductor::SongMaxLenght - 1)
Conductor::SetPosition(Conductor::SongMaxLenght);
if (IsKeyPressed(KEY_ENTER))
Conductor::SetPosition(0);
float cellDuration = Conductor::MSPerBeat / 4.0f;
float cell = Conductor::SongPosition / cellDuration;
m_LinePosition = 100.f + (cell * Constants::GridHeight);
}
void App::Draw()
{
BeginDrawing();
BeginMode2D(m_MainCamera);
ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
for (int j = 0; j < Constants::MaxColumns; j++)
{
for (size_t i = 0; i < columFuck; i++)
{
Color c = (i + j) % 2 == 0 ? BLACK : GRAY;
DrawRectangle(100 + (Constants::GridWidth * j), 100 + (Constants::GridHeight * i), Constants::GridWidth, Constants::GridHeight, c);
}
}
EndMode2D();
std::string Pos = std::to_string(Conductor::SongPosition) + "/" + std::to_string(Conductor::SongMaxLenght);
DrawLineEx({ 50, 100 }, { 500, 100 }, 2, RED);
DrawText(Pos.c_str(), 0, 0, 24, ORANGE);
EndDrawing();
}
< /code>
audio.cpp:
#include "pch.hpp"
#include "include/Audio.hpp"
#include "include/ResourceManager.hpp"
#include "include/Constants.hpp"
#include
#include
void ERRCHECK_fn(FMOD_RESULT result, const char* file, int line);
#define ERRCHECK(_result) ERRCHECK_fn(_result, __FILE__, __LINE__)
FMOD::Studio::System* Audio::fmodSys = nullptr;
FMOD::System* Audio::fmodSysLow = nullptr;
FMOD::Studio::Bank* Audio::masterBank = nullptr;
bool Audio::m_masterBankLoaded = false;
void Audio::Init()
{
ERRCHECK(FMOD::Studio::System::create(&fmodSys));
ERRCHECK(fmodSys->initialize(512, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, 0));
ERRCHECK(fmodSys->getCoreSystem(&fmodSysLow));
}
void Audio::StartSong(const std::string& path, const std::string& eventName)
{
const std::string fileName = path.substr(path.find_last_of('/') + 1);
const std::string fileNameNoExtension = fileName.substr(0 ,fileName.find('.'));
const std::string fileExtension = fileName.substr(fileName.find('.') + 1);
if (fileExtension != "bank" && ResourceManager::CheckIfChannelExsists(fileNameNoExtension) == false)
{
LoadSongLowLevel(path, fileNameNoExtension);
FMOD::Channel* newChannel;
ERRCHECK(fmodSysLow->playSound(ResourceManager::GetSound(fileNameNoExtension), nullptr, true, &newChannel));
ResourceManager::LoadChannel(fileNameNoExtension, newChannel);
ResourceManager::GetChannel(fileNameNoExtension)->setPaused(false);
}
if (fileExtension == "bank" && ResourceManager::CheckIfInstanceExsists(eventName) == false)
{
if (eventName == "")
{
std::cerr setPaused(pause));
else
std::cout
Подробнее здесь: https://stackoverflow.com/questions/794 ... little-bit
Когда я возобновите экземпляр Fmod Studio из Paus ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1739109225
Anonymous
Я использую Fmod Studio с банками в своем проекте, и я столкнулся с проблемой при приостановке и возобновлении звука. Я загружаю свой звук в качестве банка (то есть экземпляр события FMOD Studio) и использую метод SetPaUsed (TRUE), чтобы приостановить аудио. Однако, пока звук приостанавливается, внутренняя временная шкала события продолжает продвигаться. Это означает, что когда я отказался от события, позиция воспроизведения прыгает вперед (например, с 100 мс до 150 мс), хотя аудио должно было быть приостановлено. < /P>
< /p>
Вот что происходит: позиция песни отображается в верхнем левом углу. Когда я нажимаю на паузу на 2241 мс, а затем возобновите, позиция песни возвращается около 200 мс < /p>
Здесь код из app.cpp: < /p>
#include "pch.hpp"
#define RAYGUI_IMPLEMENTATION
#include "include/raygui.h"
#include "raymath.h"
#include "include/App.hpp"
#include "include/Audio.hpp"
#include "include/Constants.hpp"
#include "include/Conductor.hpp"
#include "fmod.hpp"
bool paused = true;
bool songLoad = false;
int columFuck = 0;
App::App(unsigned int Width, unsigned int Height, const std::string& title)
{
InitWindow(Width, Height, title.c_str());
SetTargetFPS(60);
Audio::Init();
Conductor::Init(77, 4, 4, Constants::SoundPath + "Episode Songs.bank", "e1-s1");
columFuck = static_cast(std::ceil(Conductor::SongMaxLenght / (Conductor::MSPerBeat / 4.0f)));
m_LinePosition = 100.f;
m_MainCamera.target = { 0.f, m_LinePosition };
m_MainCamera.rotation = 0.f;
m_MainCamera.zoom = 1.f;
m_MainCamera.offset = { 0.f , 100.f };
}
void App::Update()
{
Audio::Update();
Conductor::Update();
if(IsKeyPressed(KEY_SPACE))
{
paused = !paused;
Conductor::SetPause(paused);
}
m_MainCamera.target = { 0.f, m_LinePosition };
if (IsKeyPressed('Q'))
Conductor::SetPosition(Conductor::SongMaxLenght - 2000);
if (Conductor::SongPosition >= Conductor::SongMaxLenght - 1)
Conductor::SetPosition(Conductor::SongMaxLenght);
if (IsKeyPressed(KEY_ENTER))
Conductor::SetPosition(0);
float cellDuration = Conductor::MSPerBeat / 4.0f;
float cell = Conductor::SongPosition / cellDuration;
m_LinePosition = 100.f + (cell * Constants::GridHeight);
}
void App::Draw()
{
BeginDrawing();
BeginMode2D(m_MainCamera);
ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
for (int j = 0; j < Constants::MaxColumns; j++)
{
for (size_t i = 0; i < columFuck; i++)
{
Color c = (i + j) % 2 == 0 ? BLACK : GRAY;
DrawRectangle(100 + (Constants::GridWidth * j), 100 + (Constants::GridHeight * i), Constants::GridWidth, Constants::GridHeight, c);
}
}
EndMode2D();
std::string Pos = std::to_string(Conductor::SongPosition) + "/" + std::to_string(Conductor::SongMaxLenght);
DrawLineEx({ 50, 100 }, { 500, 100 }, 2, RED);
DrawText(Pos.c_str(), 0, 0, 24, ORANGE);
EndDrawing();
}
< /code>
audio.cpp:
#include "pch.hpp"
#include "include/Audio.hpp"
#include "include/ResourceManager.hpp"
#include "include/Constants.hpp"
#include
#include
void ERRCHECK_fn(FMOD_RESULT result, const char* file, int line);
#define ERRCHECK(_result) ERRCHECK_fn(_result, __FILE__, __LINE__)
FMOD::Studio::System* Audio::fmodSys = nullptr;
FMOD::System* Audio::fmodSysLow = nullptr;
FMOD::Studio::Bank* Audio::masterBank = nullptr;
bool Audio::m_masterBankLoaded = false;
void Audio::Init()
{
ERRCHECK(FMOD::Studio::System::create(&fmodSys));
ERRCHECK(fmodSys->initialize(512, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, 0));
ERRCHECK(fmodSys->getCoreSystem(&fmodSysLow));
}
void Audio::StartSong(const std::string& path, const std::string& eventName)
{
const std::string fileName = path.substr(path.find_last_of('/') + 1);
const std::string fileNameNoExtension = fileName.substr(0 ,fileName.find('.'));
const std::string fileExtension = fileName.substr(fileName.find('.') + 1);
if (fileExtension != "bank" && ResourceManager::CheckIfChannelExsists(fileNameNoExtension) == false)
{
LoadSongLowLevel(path, fileNameNoExtension);
FMOD::Channel* newChannel;
ERRCHECK(fmodSysLow->playSound(ResourceManager::GetSound(fileNameNoExtension), nullptr, true, &newChannel));
ResourceManager::LoadChannel(fileNameNoExtension, newChannel);
ResourceManager::GetChannel(fileNameNoExtension)->setPaused(false);
}
if (fileExtension == "bank" && ResourceManager::CheckIfInstanceExsists(eventName) == false)
{
if (eventName == "")
{
std::cerr setPaused(pause));
else
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79425005/when-i-resume-fmod-studio-instance-from-pause-song-position-shift-a-little-bit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия