| @@ -16,7 +16,9 @@ | |||||
| #include <cstdio> | #include <cstdio> | ||||
| #include <cstring> | #include <cstring> | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| # include <cell/mstream.h> /* multistream */ | |||||
| #elif defined USE_SDL_MIXER | |||||
| # if defined HAVE_SDL_SDL_H | # if defined HAVE_SDL_SDL_H | ||||
| # include <SDL/SDL.h> | # include <SDL/SDL.h> | ||||
| # else | # else | ||||
| @@ -46,7 +48,29 @@ class SampleData | |||||
| private: | private: | ||||
| String m_name; | String m_name; | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| static void Callback(int stream, void *data, int type, | |||||
| void *write_buf, int buf_size) | |||||
| { | |||||
| UNUSED(write_buf, buf_size); | |||||
| switch (type) | |||||
| { | |||||
| case CELL_MS_CALLBACK_MOREDATA: | |||||
| /* For streamed sound */ | |||||
| break; | |||||
| case CELL_MS_CALLBACK_CLOSESTREAM: | |||||
| case CELL_MS_CALLBACK_FINISHSTREAM: | |||||
| /* Finished playing */ | |||||
| break; | |||||
| default: | |||||
| /* FIXME: we can't reach here */ | |||||
| break; | |||||
| } | |||||
| } | |||||
| String m_data; | |||||
| int m_channel; | |||||
| #elif defined USE_SDL_MIXER | |||||
| Mix_Chunk *m_chunk; | Mix_Chunk *m_chunk; | ||||
| int m_channel; | int m_channel; | ||||
| #endif | #endif | ||||
| @@ -61,7 +85,24 @@ Sample::Sample(char const *path) | |||||
| { | { | ||||
| data->m_name = String("<sample> ") + path; | data->m_name = String("<sample> ") + path; | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| Array<String> pathlist = System::GetPathList(path); | |||||
| File f; | |||||
| for (int i = 0; i < pathlist.Count(); ++i) | |||||
| { | |||||
| f.Open(pathlist[i], FileAccess::Read); | |||||
| if (f.IsValid()) | |||||
| { | |||||
| data->m_data = f.ReadString(); | |||||
| f.Close(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (data->m_data.Count() == 0) | |||||
| { | |||||
| Log::Error("could not load sample %s\n", path); | |||||
| } | |||||
| #elif defined USE_SDL_MIXER | |||||
| Array<String> pathlist = System::GetPathList(path); | Array<String> pathlist = System::GetPathList(path); | ||||
| for (int i = 0; i < pathlist.Count(); ++i) | for (int i = 0; i < pathlist.Count(); ++i) | ||||
| { | { | ||||
| @@ -83,7 +124,9 @@ Sample::Sample(char const *path) | |||||
| Sample::~Sample() | Sample::~Sample() | ||||
| { | { | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| /* Nothing to do */ | |||||
| #elif defined USE_SDL_MIXER | |||||
| Mix_FreeChunk(data->m_chunk); | Mix_FreeChunk(data->m_chunk); | ||||
| #endif | #endif | ||||
| delete data; | delete data; | ||||
| @@ -101,21 +144,57 @@ char const *Sample::GetName() | |||||
| void Sample::Play() | void Sample::Play() | ||||
| { | { | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| if (data->m_data.Count() <= 64 + 256) | |||||
| return; | |||||
| data->m_channel = cellMSStreamOpen(); | |||||
| CellMSInfo mi; | |||||
| mi.SubBusGroup = CELL_MS_MASTER_BUS; | |||||
| mi.FirstBuffer = &data->m_data[0] + 64; | |||||
| /* FIXME: hardcoded crap */ | |||||
| mi.FirstBufferSize = data->m_data.Count() - 64 - 256; | |||||
| mi.SecondBuffer = nullptr; | |||||
| mi.SecondBufferSize = 0; | |||||
| mi.Pitch = 44100; | |||||
| mi.numChannels = 2; | |||||
| mi.flags = CELL_MS_STREAM_AUTOCLOSE; | |||||
| mi.initialOffset = 0; | |||||
| mi.inputType = CELL_MS_16BIT_LITTLE; | |||||
| cellMSStreamSetInfo(data->m_channel, &mi); | |||||
| cellMSStreamSetCallbackFunc(data->m_channel, SampleData::Callback); | |||||
| cellMSCoreSetVolume1(data->m_channel, CELL_MS_DRY, | |||||
| CELL_MS_SPEAKER_FL, CELL_MS_CHANNEL_0, 1.0f); | |||||
| cellMSCoreSetVolume1(data->m_channel, CELL_MS_DRY, | |||||
| CELL_MS_SPEAKER_FR, CELL_MS_CHANNEL_0, 1.0f); | |||||
| cellMSStreamPlay(data->m_channel); | |||||
| #elif defined USE_SDL_MIXER | |||||
| data->m_channel = Mix_PlayChannel(-1, data->m_chunk, 0); | data->m_channel = Mix_PlayChannel(-1, data->m_chunk, 0); | ||||
| #endif | #endif | ||||
| } | } | ||||
| void Sample::Loop() | void Sample::Loop() | ||||
| { | { | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| /* FIXME: not implemented */ | |||||
| Play(); | |||||
| #elif defined USE_SDL_MIXER | |||||
| data->m_channel = Mix_PlayChannel(-1, data->m_chunk, -1); | data->m_channel = Mix_PlayChannel(-1, data->m_chunk, -1); | ||||
| #endif | #endif | ||||
| } | } | ||||
| void Sample::Stop() | void Sample::Stop() | ||||
| { | { | ||||
| #if defined USE_SDL_MIXER | |||||
| #if __CELLOS_LV2__ | |||||
| if (data->m_channel >= 0) | |||||
| cellMSStreamClose(data->m_channel); | |||||
| data->m_channel = -1; | |||||
| #elif defined USE_SDL_MIXER | |||||
| if (data->m_channel >= 0) | if (data->m_channel >= 0) | ||||
| Mix_HaltChannel(data->m_channel); | Mix_HaltChannel(data->m_channel); | ||||
| data->m_channel = -1; | data->m_channel = -1; | ||||