Когда я возобновите экземпляр Fmod Studio из PausC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда я возобновите экземпляр Fmod Studio из Paus

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/794 ... little-bit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»