2016-12-17 68 views
0

在我的遊戲中,我有一個地圖std::map<Sound, sf::SoundBuffer> mySounds,我用它作爲聲音的資源保持者。創建指向unsigned char []的指針並將其傳遞給sf :: SoundBuffer :: loadFromMemory

Sound是一個枚舉,看起來像這樣:

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

現在,爲了加載我目前使用sf::SoundBuffer::loadFromFile的聲音,並且代碼看起來是這樣的:

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循環中有一個指針(最初只是一個空指針)。

然後,我會根據我目前在哪個循環索引(請參閱下面的代碼中的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,它失敗的所有結果笑

所以基本上我問的是:如何創建一個指向unsigned char數組的指針並將其傳遞給SFML功能sf::SoundBuffer::loadFromMemory(const void *data, size_t sizeInBytes)

+0

你確定你arnt傳遞一個空指針到這個函數?你有一個處理值(NUMBER_OF_SOUNDS) –

回答

1

問題可能與您撥打loadFromMemory()

特別是,sizeof(buffer)的值可能是一個基於指針佔用多少內存的常量。 (例如8個字節的64位平臺上。)

我懷疑,這將是大到足以容納聲音信息... :)

你想通過數組的大小。要按照您的模式:

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