|
|
@@ -16,7 +16,9 @@ |
|
|
|
#include <cstdio> |
|
|
|
#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 |
|
|
|
# include <SDL/SDL.h> |
|
|
|
# else |
|
|
@@ -46,7 +48,29 @@ class SampleData |
|
|
|
|
|
|
|
private: |
|
|
|
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; |
|
|
|
int m_channel; |
|
|
|
#endif |
|
|
@@ -61,7 +85,24 @@ Sample::Sample(char const *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); |
|
|
|
for (int i = 0; i < pathlist.Count(); ++i) |
|
|
|
{ |
|
|
@@ -83,7 +124,9 @@ Sample::Sample(char const *path) |
|
|
|
|
|
|
|
Sample::~Sample() |
|
|
|
{ |
|
|
|
#if defined USE_SDL_MIXER |
|
|
|
#if __CELLOS_LV2__ |
|
|
|
/* Nothing to do */ |
|
|
|
#elif defined USE_SDL_MIXER |
|
|
|
Mix_FreeChunk(data->m_chunk); |
|
|
|
#endif |
|
|
|
delete data; |
|
|
@@ -101,21 +144,57 @@ char const *Sample::GetName() |
|
|
|
|
|
|
|
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); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
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); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
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) |
|
|
|
Mix_HaltChannel(data->m_channel); |
|
|
|
data->m_channel = -1; |
|
|
|