2013-10-13 3 views
2

현재 FMOD를 사용하여 사운드 플레이어를 디자인하려고합니다. 나는 하나의 사운드 포인터를 사용하지만 여러 번 createStream을 호출 할 때 메모리 사용이 계속 증가한다는 목표를 달성하려고합니다. 어쨌든 여러 Sound 포인터를 사용하지 않고도 그것을 향상시킬 수 있습니까?FMOD - createStream을 여러 번 호출하면 메모리 사용량이 계속 증가합니다.

SoundClass.h

#ifndef _SOUNDCLASS_H_ 
#define _SOUNDCLASS_H_ 


////////////// 
// INCLUDES // 
////////////// 
#include "FMOD/fmod.hpp" 
using namespace FMOD; 


//////////////////////////////////////////////////////////////////////////////// 
// Class name: SoundClass 
//////////////////////////////////////////////////////////////////////////////// 
class SoundClass 
{ 
public: 
    SoundClass(); 
    ~SoundClass(); 
    bool Initialize(); 
    float Load(const int& trackNo); 
    void Play(); 
    void Stop(); 
    void Pause(); 
    void Resume(); 
    void Next(int& trackNo, float& totalTrackLength); 
    void Previous(int& trackNo, float& totalTrackLength); 

private: 
    bool m_isFirstRun; 
    bool m_isLoad; 
    bool m_isPlay; 
    int m_currentTrackNo; 
    unsigned int* m_trackLength; 

    FMOD_RESULT result; 
    System* fmodSystem; 
    Channel* fmodChannel; 
    Sound* track; 
}; 

#endif 

SoundClass.cpp

#include "SoundClass.h" 

SoundClass::SoundClass() 
{ 
    fmodSystem   = 0; 
    track    = 0; 
    fmodChannel   = 0; 
    m_isFirstRun  = true; 
    m_isLoad   = true; 
    m_isPlay   = true; 
    m_currentTrackNo = 0; 
    m_trackLength  = new unsigned int; 
} 


SoundClass::~SoundClass() 
{ 
    /* 
    Cleaning up... 
    */ 
    track->release(); 
    fmodSystem->release(); 
} 


bool SoundClass::Initialize() 
{ 
    /* 
    Setup FMOD for your application. 
    */ 

    // Create a FMOD system. 
    result = System_Create(&fmodSystem); 

    // Similar to HRESULT, FMOD use FMOD_RESULT to keep track of the execution result. 
    if (result != FMOD_OK) 
    { 
     return false; 
    } 

    // Alternately, you can check for the availability of the system. 
    if (!fmodSystem) 
    { 
     return false; 
    } 

    // Initialize FMOD. 
    result = fmodSystem->init(100, FMOD_INIT_NORMAL, 0); 

    if (result != FMOD_OK) 
    { 
     return false; 
    } 

    return true; 
} 


float SoundClass::Load(const int& trackNo) 
{ 
    /* 
    Load a sound file. 
    */ 

    // FMOD sound source. 
    switch (trackNo) 
    { 
    case 0: 
     fmodSystem->createStream("resources/audio/01.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 1: 
     fmodSystem->createStream("resources/audio/02.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 2: 
     fmodSystem->createStream("resources/audio/03.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 3: 
     fmodSystem->createStream("resources/audio/04.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 4: 
    fmodSystem->createStream("resources/audio/05.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 5: 
     fmodSystem->createStream("resources/audio/06.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 6: 
     fmodSystem->createStream("resources/audio/07.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 7: 
     fmodSystem->createStream("resources/audio/08.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 8: 
     fmodSystem->createStream("resources/audio/09.ogg", FMOD_DEFAULT, 0, &track); 
     break; 

    case 9: 
     fmodSystem->createStream("resources/audio/10.ogg", FMOD_DEFAULT, 0, &track); 
     break; 
} 

    m_currentTrackNo = trackNo; 

    track->getLength(m_trackLength, FMOD_TIMEUNIT_MS); 
    return (float)*m_trackLength/1000; 
} 


void SoundClass::Play() 
{ 
    // Play sound on a channel 
    fmodSystem->playSound(FMOD_CHANNEL_REUSE, track, false, &fmodChannel); 
} 


void SoundClass::Stop() 
{ 
    fmodChannel->stop(); 
} 


void SoundClass::Pause() 
{ 
    fmodChannel->setPaused(true); 
} 


void SoundClass::Resume() 
{ 
    fmodChannel->setPaused(false); 
} 


void SoundClass::Next(int& trackNo, float& totalTrackLength) 
{ 
    if (m_currentTrackNo != 9) 
    { 
     totalTrackLength = Load(m_currentTrackNo + 1); 
     trackNo = m_currentTrackNo; 
     Play(); 
    } 
} 


void SoundClass::Previous(int& trackNo, float& totalTrackLength) 
{ 
    if (m_currentTrackNo != 0) 
    { 
     totalTrackLength = Load(m_currentTrackNo - 1); 
     trackNo = m_currentTrackNo; 
     Play(); 
    } 
} 
+0

문제를 재현하는 최소한의 예를 게시하십시오. –

답변

1

하나의 작은 메모리 누수가 m_trackLengthnew -ed하지만 delete -d되는이 있다는 것입니다. 그러나 기여하고있는 다른 것이있을 수 있습니다.

+0

'm_trackLength'가 왜 포인터인지 궁금합니다 : / –