Changeset 2569


Ignore:
Timestamp:
Mar 8, 2013, 2:20:50 PM (7 years ago)
Author:
sam
Message:

ps3: create an audio device at startup.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/build/vs2010/Lol.Core.Vars.props

    r2399 r2569  
    8181    <Ps3Deps>libsysmodule_stub.a;libsysutil_stub.a;libresc_stub.a;
    8282             libpngdec_stub.a;
    83              libio_stub.a;libusbd_stub.a;libpadfilter.a</Ps3Deps>
     83             libio_stub.a;libusbd_stub.a;libpadfilter.a;
     84             libaudio_stub.a;libspurs_stub.a;libmstreamSPURSMP3.a</Ps3Deps>
    8485
    8586    <!-- X360-specific -->
  • trunk/configure.ac

    r2568 r2569  
    227227  dnl  For the pad library
    228228  LOL_LIBS="${LOL_LIBS} -lio_stub -lusbd_stub -lpadfilter"
     229  dnl  For the audio library
     230  LOL_LIBS="${LOL_LIBS} -laudio_stub -lspurs_stub -lmstreamSPURSMP3"
    229231  dnl  Disable this warning, it's too verbose with vector.h
    230232  AM_CXXFLAGS="${AM_CXXFLAGS} -Wno-sign-compare"
  • trunk/src/platform/ps3/ps3app.cpp

    r2506 r2569  
    1919#   include <cell/sysmodule.h>
    2020#   include <PSGL/psgl.h>
     21
     22#   include <cell/mstream.h> /* multistream */
     23
     24#   include <cell/spurs/control.h> /* SPURS */
     25#   include <cell/spurs/task.h>
     26#   include <cell/spurs/event_flag.h>
    2127#endif
    2228
     
    3339 */
    3440
     41/* FIXME: this shouldn't be a global */
     42static unsigned int port_num;
     43
    3544class Ps3AppData
    3645{
     
    4453            Ticker::Shutdown();
    4554    }
     55
     56    static void MultiStreamThread(uint64_t param)
     57    {
     58        Timer t;
     59        cellAudioPortStart(port_num);
     60        /* FIXME: quit gracefully if needed */
     61        while (true)
     62        {
     63            if (!cellMSSystemSignalSPU())
     64            {
     65               t.Get();
     66               t.Wait(1.f / 60.f / 32);
     67            }
     68
     69            cellMSSystemGenerateCallbacks();
     70        }
     71        cellAudioPortStop(port_num);
     72        sys_ppu_thread_exit(0);
     73    }
     74
     75    CellSpurs m_spurs __attribute__((aligned (128)));
    4676#endif
    4777};
     
    134164    psglResetCurrentContext();
    135165
     166    /* Create audio device */
     167    cellSysmoduleLoadModule(CELL_SYSMODULE_IO);
     168    cellSysmoduleLoadModule(CELL_SYSMODULE_AUDIO);
     169    cellSysmoduleLoadModule(CELL_SYSMODULE_RESC);
     170    cellSysmoduleLoadModule(CELL_SYSMODULE_SPURS);
     171
     172    int ret = cellMSSystemConfigureSysUtilEx(CELL_MS_AUDIOMODESELECT_SUPPORTSLPCM
     173                                           | CELL_MS_AUDIOMODESELECT_SUPPORTSDOLBY
     174                                           | CELL_MS_AUDIOMODESELECT_SUPPORTSDTS
     175                                           | CELL_MS_AUDIOMODESELECT_PREFERDOLBY);
     176    int num_chans = ret & 0xf;
     177    int has_dolby = (ret & 0x10) >> 4;
     178    int has_dts = (ret & 0x20) >> 5;
     179
     180    Log::Debug("audio channels %d, dolby %d, DTS %d\n",
     181               num_chans, has_dolby, has_dts);
     182    ret = cellAudioInit();
     183
     184    CellAudioPortParam ap;
     185    memset(&ap, 0, sizeof(ap));
     186    ap.nChannel = CELL_AUDIO_PORT_8CH;
     187    ap.nBlock = CELL_AUDIO_BLOCK_8;
     188    ret = cellAudioPortOpen(&ap, &port_num);
     189    Log::Debug("audio port %d\n", port_num);
     190
     191    CellAudioPortConfig pc;
     192    ret = cellAudioGetPortConfig(port_num, &pc);
     193
     194    cellMSSystemConfigureLibAudio(&ap, &pc);
     195
     196    CellMSSystemConfig cfg;
     197    cfg.channelCount = 400; /* Maximum number of streams */
     198    cfg.subCount = 31; /* ? */
     199    cfg.dspPageCount = 5;
     200    cfg.flags = CELL_MS_NOFLAGS;
     201
     202    uint8_t const prios[8] = { 1, 0, 0, 0, 0, 0, 0, 0 };
     203    int mem_needed = cellMSSystemGetNeededMemorySize(&cfg);
     204    void *ms_mem = memalign(128, mem_needed);
     205    sys_ppu_thread_t tid;
     206    sys_ppu_thread_get_id(&tid);
     207    int tprio;
     208    sys_ppu_thread_get_priority(tid, &tprio);
     209    cellSpursInitialize(&data->m_spurs, 1, 250 /* thread group priority */,
     210                        tprio - 1, false);
     211    cellMSSystemInitSPURS(ms_mem, &cfg, &data->m_spurs, &prios[0]);
     212
     213    float const bus_vols[64] =
     214    {
     215        1.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
     216        0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
     217        0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f,
     218        0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f,
     219        0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f,
     220        0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f,
     221        0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f,
     222        0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f,
     223    };
     224
     225    sys_ppu_thread_t thread;
     226    ret = sys_ppu_thread_create(&thread, Ps3AppData::MultiStreamThread,
     227                                NULL, 0 /* Server prio */,
     228                                0x4000 /* 16 KiB stack */,
     229                                SYS_PPU_THREAD_CREATE_JOINABLE,
     230                                "Audio Thread");
     231
     232    cellMSCoreSetVolume64(CELL_MS_SUBBUS_1, CELL_MS_DRY, bus_vols);
     233    cellMSCoreSetVolume64(CELL_MS_MASTER_BUS, CELL_MS_DRY, bus_vols);
     234
    136235    /* Initialise everything */
    137236    Ticker::Setup(fps);
     
    166265#if defined __CELLOS_LV2__
    167266    glFinish();
     267
     268    /* Unload audio modules */
     269    cellSysmoduleUnloadModule(CELL_SYSMODULE_IO);
     270    cellSysmoduleUnloadModule(CELL_SYSMODULE_AUDIO);
     271    cellSysmoduleUnloadModule(CELL_SYSMODULE_RESC);
     272    cellSysmoduleUnloadModule(CELL_SYSMODULE_SPURS);
    168273#endif
    169274    delete data;
Note: See TracChangeset for help on using the changeset viewer.