2016-12-17 7 views
0

제 게임에서 나는 사운드 리소스 홀더로 사용하는 std::map<Sound, sf::SoundBuffer> mySounds 맵을 가지고 있습니다. 나는 현재 sf::SoundBuffer::loadFromFile를 사용하여 사운드를로드하기 위해 지금서명되지 않은 char []에 대한 포인터를 생성하여 sf :: SoundBuffer :: loadFromMemory에 전달하십시오.

enum class Sound { 
    SOUND_ONE, 
    SOUND_TWO, 
    SOUND_THREE, 
    NUMBER_OF_SOUNDS 
}; 

, 그리고 코드는 다음과 같습니다 :

Sound

은 다음과 같습니다 열거입니다

std::vector<std::string> paths; 
paths.resize(static_cast<unsigned int>(Sound::NUMBER_OF_SOUNDS)); 
paths[static_cast<std::size_t>(Sound::SOUND_ONE)] = "sound1.ogg"; 
paths[static_cast<std::size_t>(Sound::SOUND_TWO)] = "sound2.ogg"; 
paths[static_cast<std::size_t>(Sound::SOUND_THREE)] = "sound3.ogg"; 

for (std::size_t i = 0; i < static_cast<std::size_t>(Sound::NUMBER_OF_SOUNDS); ++i) { 
    mySounds[static_cast<Sound>(i)].loadFromFile("./data/" + paths[i]); 
} 

이 잘 작동 . 이제 문제

:

내 릴리스 빌드를 들어 나는 (도구라는 bin2h 사용) 바이트 배열에 모든 소리를 변환 한 후 sf::SoundBuffer::loadFromMemory()을 사용하고 싶습니다. 같을 것이다

배열 : 나는 단지 하나의 소리를 가지고 있다면

unsigned char RES_SOUND_ONE[] = {0x4f,0x67,0x67,0x53,...}; 
unsigned char RES_SOUND_TWO[] = {0x52,0x88,0x29,0x47,...}; 
unsigned char RES_SOUND_THREE[] = {0x96,0x65,0x59,0x02,...}; 

, 나는 간단하게 작성할 수

mySound.loadFromMemory(RES_SOUND_ONE, sizeof(RES_SOUND_ONE)); 

하고 완벽하게 작동합니다.

나는 하나 이상의 소리를 가지고 있으므로 for-loop (처음에는 널 포인터) 안에 포인터가있을 것을 생각하고 있었다.

그렇다면 현재 루프 인덱스를 기반으로 적절한 바이트 배열에 포인터를 설정해야합니다 (아래 코드 switch 참조).

그런 다음 해당 포인터를 데이터에 loadFromMemory 함수로 전달합니다.

for (std::size_t i = 0; i < static_cast<std::size_t>(Sound::NUMBER_OF_SOUNDS); ++i) { 
    void *buffer = nullptr; 
    switch (static_cast<Sound>(i)) { 
    case Sound::SOUND_ONE: { buffer = (unsigned char*)RES_SOUND_ONE; } break; 
    case Sound::SOUND_TWO: { buffer = (unsigned char*)RES_SOUND_TWO; } break; 
    case Sound::SOUND_THREE: { buffer = (unsigned char*)RES_SOUND_THREE; } break; 
    } 
    mySounds[static_cast<Sound>(i)].loadFromMemory(buffer, sizeof(buffer)); 
} 

SFML 오류 메시지는 다음과 같습니다

Failed to open sound file from memory (format not supported)

나는 또한 memcpy 같은 여러 가지 다른 것들을 시도하고

매우 뭔가를 잘못하고 있어요

실패의 모든 결과 롤

기본적으로 내가 묻는 것은 : 서명되지 않은 char 배열에 대한 포인터를 생성하고 SFML 함수 sf::SoundBuffer::loadFromMemory(const void *data, size_t sizeInBytes)

+0

이 함수에 널 포인터를 전달 하시겠습니까? 하나의 처리 된 가치가 있습니다 (NUMBER_OF_SOUNDS) –

답변

1

loadFromMemory()을 호출 할 때 문제가있을 수 있습니다.

특히, sizeof(buffer)의 값은 포인터가 차지하는 메모리 양에 따라 상수 일 수 있습니다. (64 비트 플랫폼에서 예를 들어 8 바이트.)

나는 그 소리 정보를 포함 할 수있을만큼 충분히 큰 것입니다 의심의 여지가 ... :)

당신은 배열의 크기를 전달하려는.귀하의 패턴을 따르려면 :

for (size_t i = 0; i < static_cast<size_t>(Sound::NUMBER_OF_SOUNDS); ++i) 
{ 
    unsigned char *buf = nullptr; 
    size_t siz = 0; 
    switch (static_cast<Sound>(i)) 
    { 
     case Sound::SOUND_ONE: 
      buf = RES_SOUND_ONE; 
      siz = sizeof (RES_SOUND_ONE); 
      break; 
     case Sound::SOUND_TWO: 
      buf = RES_SOUND_TWO; 
      siz = sizeof (RES_SOUND_TWO); 
      break; 
     case Sound::SOUND_THREE: 
      buf = RES_SOUND_THREE; 
      siz = sizeof (RES_SOUND_THREE); 
      break; 
    } 
    mySounds[static_cast<Sound>(i)].loadFromMemory(buf, siz); 
} 
+0

대단히 감사합니다! – user3881815