Browse Source

ps3: implement very simple audio playback.

legacy
Sam Hocevar sam 11 years ago
parent
commit
75d4503a01
1 changed files with 86 additions and 7 deletions
  1. +86
    -7
      src/sample.cpp

+ 86
- 7
src/sample.cpp View File

@@ -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;


Loading…
Cancel
Save