Little fix

This commit is contained in:
Nekotekina 2014-03-31 10:19:51 +04:00
parent 2d955dc297
commit 9afbbfad0a
3 changed files with 258 additions and 256 deletions

View file

@ -140,6 +140,9 @@ int cellAudioInit()
auto buf = (be_t<float>*)&Memory[buf_addr]; auto buf = (be_t<float>*)&Memory[buf_addr];
static const float k = 1.0f;
const float m = (port.level == 0.0f) ? 1.0f : port.level;
if (port.channel == 2) if (port.channel == 2)
{ {
if (first_mix) if (first_mix)
@ -147,8 +150,7 @@ int cellAudioInit()
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i++) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i++)
{ {
// reverse byte order // reverse byte order
buffer[i] = buf[i]; buffer[i] = buf[i] * m;
// TODO: use port.m_param.level
} }
first_mix = false; first_mix = false;
} }
@ -156,7 +158,7 @@ int cellAudioInit()
{ {
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i++) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i++)
{ {
buffer[i] += buf[i]; buffer[i] += buf[i] * m;
} }
} }
} }
@ -167,8 +169,8 @@ int cellAudioInit()
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2)
{ {
const float center = (buf[i*3+2] + buf[i*3+3]) * 0.708f; const float center = (buf[i*3+2] + buf[i*3+3]) * 0.708f;
buffer[i] = (buf[i*3] + buf[i*3+4] + center) * 0.5f; buffer[i] = (buf[i*3] + buf[i*3+4] + center) * k * m;
buffer[i+1] = (buf[i*3+1] + buf[i*3+5] + center) * 0.5f; buffer[i+1] = (buf[i*3+1] + buf[i*3+5] + center) * k * m;
} }
first_mix = false; first_mix = false;
} }
@ -177,8 +179,8 @@ int cellAudioInit()
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2)
{ {
const float center = (buf[i*3+2] + buf[i*3+3]) * 0.708f; const float center = (buf[i*3+2] + buf[i*3+3]) * 0.708f;
buffer[i] += (buf[i*3] + buf[i*3+4] + center) * 0.5f; buffer[i] += (buf[i*3] + buf[i*3+4] + center) * k * m;
buffer[i+1] += (buf[i*3+1] + buf[i*3+5] + center) * 0.5f; buffer[i+1] += (buf[i*3+1] + buf[i*3+5] + center) * k * m;
} }
} }
} }
@ -189,8 +191,8 @@ int cellAudioInit()
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2)
{ {
const float center = (buf[i*4+2] + buf[i*4+3]) * 0.708f; const float center = (buf[i*4+2] + buf[i*4+3]) * 0.708f;
buffer[i] = (buf[i*4] + buf[i*4+4] + buf[i*4+6] + center) * 0.5f; buffer[i] = (buf[i*4] + buf[i*4+4] + buf[i*4+6] + center) * k * m;
buffer[i+1] = (buf[i*4+1] + buf[i*4+5] + buf[i*4+7] + center) * 0.5f; buffer[i+1] = (buf[i*4+1] + buf[i*4+5] + buf[i*4+7] + center) * k * m;
} }
first_mix = false; first_mix = false;
} }
@ -199,8 +201,8 @@ int cellAudioInit()
for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2) for (u32 i = 0; i < (sizeof(buffer) / sizeof(float)); i += 2)
{ {
const float center = (buf[i*4+2] + buf[i*4+3]) * 0.708f; const float center = (buf[i*4+2] + buf[i*4+3]) * 0.708f;
buffer[i] += (buf[i*4] + buf[i*4+4] + buf[i*4+6] + center) * 0.5f; buffer[i] += (buf[i*4] + buf[i*4+4] + buf[i*4+6] + center) * k * m;
buffer[i+1] += (buf[i*4+1] + buf[i*4+5] + buf[i*4+7] + center) * 0.5f; buffer[i+1] += (buf[i*4+1] + buf[i*4+5] + buf[i*4+7] + center) * k * m;
} }
} }
} }

View file

@ -1,244 +1,244 @@
#pragma once #pragma once
#include "Emu/Cell/SPURSManager.h" #include "Emu/Cell/SPURSManager.h"
// Core return codes. // Core return codes.
enum enum
{ {
CELL_SPURS_CORE_ERROR_AGAIN = 0x80410701, CELL_SPURS_CORE_ERROR_AGAIN = 0x80410701,
CELL_SPURS_CORE_ERROR_INVAL = 0x80410702, CELL_SPURS_CORE_ERROR_INVAL = 0x80410702,
CELL_SPURS_CORE_ERROR_NOMEM = 0x80410704, CELL_SPURS_CORE_ERROR_NOMEM = 0x80410704,
CELL_SPURS_CORE_ERROR_SRCH = 0x80410705, CELL_SPURS_CORE_ERROR_SRCH = 0x80410705,
CELL_SPURS_CORE_ERROR_PERM = 0x80410709, CELL_SPURS_CORE_ERROR_PERM = 0x80410709,
CELL_SPURS_CORE_ERROR_BUSY = 0x8041070A, CELL_SPURS_CORE_ERROR_BUSY = 0x8041070A,
CELL_SPURS_CORE_ERROR_STAT = 0x8041070F, CELL_SPURS_CORE_ERROR_STAT = 0x8041070F,
CELL_SPURS_CORE_ERROR_ALIGN = 0x80410710, CELL_SPURS_CORE_ERROR_ALIGN = 0x80410710,
CELL_SPURS_CORE_ERROR_NULL_POINTER = 0x80410711, CELL_SPURS_CORE_ERROR_NULL_POINTER = 0x80410711,
}; };
// Task return codes. // Task return codes.
enum enum
{ {
CELL_SPURS_TASK_ERROR_AGAIN = 0x80410901, CELL_SPURS_TASK_ERROR_AGAIN = 0x80410901,
CELL_SPURS_TASK_ERROR_INVAL = 0x80410902, CELL_SPURS_TASK_ERROR_INVAL = 0x80410902,
CELL_SPURS_TASK_ERROR_NOMEM = 0x80410904, CELL_SPURS_TASK_ERROR_NOMEM = 0x80410904,
CELL_SPURS_TASK_ERROR_SRCH = 0x80410905, CELL_SPURS_TASK_ERROR_SRCH = 0x80410905,
CELL_SPURS_TASK_ERROR_NOEXEC = 0x80410907, CELL_SPURS_TASK_ERROR_NOEXEC = 0x80410907,
CELL_SPURS_TASK_ERROR_PERM = 0x80410909, CELL_SPURS_TASK_ERROR_PERM = 0x80410909,
CELL_SPURS_TASK_ERROR_BUSY = 0x8041090A, CELL_SPURS_TASK_ERROR_BUSY = 0x8041090A,
CELL_SPURS_TASK_ERROR_FAULT = 0x8041090D, CELL_SPURS_TASK_ERROR_FAULT = 0x8041090D,
CELL_SPURS_TASK_ERROR_STAT = 0x8041090F, CELL_SPURS_TASK_ERROR_STAT = 0x8041090F,
CELL_SPURS_TASK_ERROR_ALIGN = 0x80410910, CELL_SPURS_TASK_ERROR_ALIGN = 0x80410910,
CELL_SPURS_TASK_ERROR_NULL_POINTER = 0x80410911, CELL_SPURS_TASK_ERROR_NULL_POINTER = 0x80410911,
CELL_SPURS_TASK_ERROR_FATAL = 0x80410914, CELL_SPURS_TASK_ERROR_FATAL = 0x80410914,
CELL_SPURS_TASK_ERROR_SHUTDOWN = 0x80410920, CELL_SPURS_TASK_ERROR_SHUTDOWN = 0x80410920,
}; };
// Core CellSpurs structures. // Core CellSpurs structures.
struct CellSpurs struct CellSpurs
{ {
SPURSManager *spurs; SPURSManager *spurs;
}; };
struct CellSpurs2 struct CellSpurs2
{ {
SPURSManager *spurs; SPURSManager *spurs;
}; };
struct CellSpursAttribute struct CellSpursAttribute
{ {
SPURSManagerAttribute *attr; SPURSManagerAttribute *attr;
}; };
struct CellSpursInfo struct CellSpursInfo
{ {
be_t<int> nSpus; be_t<int> nSpus;
be_t<int> spuThreadGroupPriority; be_t<int> spuThreadGroupPriority;
be_t<int> ppuThreadPriority; be_t<int> ppuThreadPriority;
bool exitIfNoWork; bool exitIfNoWork;
bool spurs2; bool spurs2;
be_t<u32> traceBuffer_addr; //void *traceBuffer; be_t<u32> traceBuffer_addr; //void *traceBuffer;
be_t<u64> traceBufferSize; be_t<u64> traceBufferSize;
be_t<u32> traceMode; be_t<u32> traceMode;
be_t<u32> spuThreadGroup; //typedef u32 sys_spu_thread_group_t; be_t<u32> spuThreadGroup; //typedef u32 sys_spu_thread_group_t;
be_t<u32> spuThreads[8]; //typedef u32 sys_spu_thread_t; be_t<u32> spuThreads[8]; //typedef u32 sys_spu_thread_t;
be_t<u32> spursHandlerThread0; be_t<u32> spursHandlerThread0;
be_t<u32> spursHandlerThread1; be_t<u32> spursHandlerThread1;
char namePrefix[CELL_SPURS_NAME_MAX_LENGTH+1]; char namePrefix[CELL_SPURS_NAME_MAX_LENGTH+1];
be_t<u64> namePrefixLength; be_t<u64> namePrefixLength;
be_t<u32> deadlineMissCounter; be_t<u32> deadlineMissCounter;
be_t<u32> deadlineMeetCounter; be_t<u32> deadlineMeetCounter;
//u8 padding[]; //u8 padding[];
}; };
struct CellSpursExceptionInfo struct CellSpursExceptionInfo
{ {
be_t<u32> spu_thread; be_t<u32> spu_thread;
be_t<u32> spu_npc; be_t<u32> spu_npc;
be_t<u32> cause; be_t<u32> cause;
be_t<u64> option; be_t<u64> option;
}; };
struct CellSpursTraceInfo struct CellSpursTraceInfo
{ {
be_t<u32> spu_thread[8]; be_t<u32> spu_thread[8];
be_t<u32> count[8]; be_t<u32> count[8];
be_t<u32> spu_thread_grp; be_t<u32> spu_thread_grp;
be_t<u32> nspu; be_t<u32> nspu;
//u8 padding[]; //u8 padding[];
}; };
struct CellTraceHeader struct CellTraceHeader
{ {
u8 tag; u8 tag;
u8 length; u8 length;
u8 cpu; u8 cpu;
u8 thread; u8 thread;
be_t<u32> time; be_t<u32> time;
}; };
struct CellSpursTracePacket struct CellSpursTracePacket
{ {
struct header_struct struct header_struct
{ {
u8 tag; u8 tag;
u8 length; u8 length;
u8 spu; u8 spu;
u8 workload; u8 workload;
be_t<u32> time; be_t<u32> time;
} header; } header;
struct data_struct struct data_struct
{ {
struct load_struct struct load_struct
{ {
be_t<u32> ea; be_t<u32> ea;
be_t<u16> ls; be_t<u16> ls;
be_t<u16> size; be_t<u16> size;
} load; } load;
struct map_struct struct map_struct
{ {
be_t<u32> offset; be_t<u32> offset;
be_t<u16> ls; be_t<u16> ls;
be_t<u16> size; be_t<u16> size;
} map; } map;
struct start_struct struct start_struct
{ {
char module[4]; char module[4];
be_t<u16> level; be_t<u16> level;
be_t<u16> ls; be_t<u16> ls;
} start; } start;
be_t<u64> user; be_t<u64> user;
be_t<u64> guid; be_t<u64> guid;
} data; } data;
}; };
// cellSpurs taskset structures. // cellSpurs taskset structures.
struct CellSpursTaskset struct CellSpursTaskset
{ {
u8 skip[6400]; u8 skip[6400];
}; };
// Exception handlers. // Exception handlers.
typedef void (*CellSpursGlobalExceptionEventHandler)(mem_ptr_t<CellSpurs> spurs, const mem_ptr_t<CellSpursExceptionInfo> info, typedef void (*CellSpursGlobalExceptionEventHandler)(mem_ptr_t<CellSpurs> spurs, const mem_ptr_t<CellSpursExceptionInfo> info,
uint id, mem_ptr_t<void> arg); uint id, mem_ptr_t<void> arg);
typedef void (*CellSpursTasksetExceptionEventHandler)(mem_ptr_t<CellSpurs> spurs, mem_ptr_t<CellSpursTaskset> taskset, typedef void (*CellSpursTasksetExceptionEventHandler)(mem_ptr_t<CellSpurs> spurs, mem_ptr_t<CellSpursTaskset> taskset,
uint idTask, const mem_ptr_t<CellSpursExceptionInfo> info, mem_ptr_t<void> arg); uint idTask, const mem_ptr_t<CellSpursExceptionInfo> info, mem_ptr_t<void> arg);
struct CellSpursTasksetInfo struct CellSpursTasksetInfo
{ {
//CellSpursTaskInfo taskInfo[CELL_SPURS_MAX_TASK]; //CellSpursTaskInfo taskInfo[CELL_SPURS_MAX_TASK];
be_t<u64> argument; be_t<u64> argument;
be_t<uint> idWorkload; be_t<uint> idWorkload;
be_t<uint> idLastScheduledTask; //typedef unsigned CellSpursTaskId be_t<uint> idLastScheduledTask; //typedef unsigned CellSpursTaskId
be_t<u32> name_addr; be_t<u32> name_addr;
CellSpursTasksetExceptionEventHandler exceptionEventHandler; CellSpursTasksetExceptionEventHandler exceptionEventHandler;
be_t<u32> exceptionEventHandlerArgument_addr; //void *exceptionEventHandlerArgument be_t<u32> exceptionEventHandlerArgument_addr; //void *exceptionEventHandlerArgument
be_t<u64> sizeTaskset; be_t<u64> sizeTaskset;
//be_t<u8> reserved[]; //be_t<u8> reserved[];
}; };
struct CellSpursTaskset2 struct CellSpursTaskset2
{ {
be_t<u8> skip[10496]; be_t<u8> skip[10496];
}; };
struct CellSpursTasksetAttribute2 struct CellSpursTasksetAttribute2
{ {
be_t<u32> revision; be_t<u32> revision;
be_t<u32> name_addr; be_t<u32> name_addr;
be_t<u64> argTaskset; be_t<u64> argTaskset;
u8 priority[8]; u8 priority[8];
be_t<u32> maxContention; be_t<u32> maxContention;
be_t<s32> enableClearLs; be_t<s32> enableClearLs;
be_t<s32> CellSpursTaskNameBuffer_addr; //??? *taskNameBuffer be_t<s32> CellSpursTaskNameBuffer_addr; //??? *taskNameBuffer
//be_t<u32> __reserved__[]; //be_t<u32> __reserved__[];
}; };
// cellSpurs task structures. // cellSpurs task structures.
struct CellSpursTaskNameBuffer struct CellSpursTaskNameBuffer
{ {
char taskName[CELL_SPURS_MAX_TASK][CELL_SPURS_MAX_TASK_NAME_LENGTH]; char taskName[CELL_SPURS_MAX_TASK][CELL_SPURS_MAX_TASK_NAME_LENGTH];
}; };
struct CellSpursTraceTaskData struct CellSpursTraceTaskData
{ {
be_t<u32> incident; be_t<u32> incident;
be_t<u32> task; be_t<u32> task;
}; };
struct CellSpursTaskArgument struct CellSpursTaskArgument
{ {
be_t<u32> u32[4]; be_t<u32> u32[4];
be_t<u64> u64[2]; be_t<u64> u64[2];
}; };
struct CellSpursTaskLsPattern struct CellSpursTaskLsPattern
{ {
be_t<u32> u32[4]; be_t<u32> u32[4];
be_t<u64> u64[2]; be_t<u64> u64[2];
}; };
struct CellSpursTaskAttribute2 struct CellSpursTaskAttribute2
{ {
be_t<u32> revision; be_t<u32> revision;
be_t<u32> sizeContext; be_t<u32> sizeContext;
be_t<u64> eaContext; be_t<u64> eaContext;
CellSpursTaskLsPattern lsPattern; //??? CellSpursTaskLsPattern lsPattern; //???
be_t<u32> name_addr; be_t<u32> name_addr;
//be_t<u32> __reserved__[]; //be_t<u32> __reserved__[];
}; };
struct CellSpursTaskExitCode struct CellSpursTaskExitCode
{ {
unsigned char skip[128]; unsigned char skip[128];
}; };
struct CellSpursTaskInfo struct CellSpursTaskInfo
{ {
CellSpursTaskLsPattern lsPattern; CellSpursTaskLsPattern lsPattern;
CellSpursTaskArgument argument; CellSpursTaskArgument argument;
const be_t<u32> eaElf_addr; //void *eaElf const be_t<u32> eaElf_addr; //void *eaElf
const be_t<u32> eaContext_addr; //void *eaContext const be_t<u32> eaContext_addr; //void *eaContext
be_t<u32> sizeContext; be_t<u32> sizeContext;
be_t<u8> state; be_t<u8> state;
be_t<u8> hasSignal; be_t<u8> hasSignal;
const be_t<u32> CellSpursTaskExitCode_addr; const be_t<u32> CellSpursTaskExitCode_addr;
u8 guid[8]; u8 guid[8];
//be_t<u8> reserved[]; //be_t<u8> reserved[];
}; };
struct CellSpursTaskBinInfo struct CellSpursTaskBinInfo
{ {
be_t<u64> eaElf; be_t<u64> eaElf;
be_t<u32> sizeContext; be_t<u32> sizeContext;
be_t<u32> __reserved__; be_t<u32> __reserved__;
CellSpursTaskLsPattern lsPattern; CellSpursTaskLsPattern lsPattern;
}; };
// cellSpurs event flag. // cellSpurs event flag.
struct CellSpursEventFlag { struct CellSpursEventFlag {
u8 skip[128]; u8 skip[128];

View file

@ -55,8 +55,8 @@ int cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, u32 addr, u32 sampl
for (u32 i = 0; i < samples; i++) for (u32 i = 0; i < samples; i++)
{ {
const float center = *(be_t<float>*)&Memory[addr + i * sizeof(float)]; const float center = *(be_t<float>*)&Memory[addr + i * sizeof(float)];
mixdata[i*8+0] += center * 2; mixdata[i*8+0] += center;
mixdata[i*8+1] += center * 2; mixdata[i*8+1] += center;
} }
} }
else if (ch == 2) else if (ch == 2)
@ -66,8 +66,8 @@ int cellAANAddData(u32 aan_handle, u32 aan_port, u32 offset, u32 addr, u32 sampl
{ {
const float left = *(be_t<float>*)&Memory[addr + i * 2 * sizeof(float)]; const float left = *(be_t<float>*)&Memory[addr + i * 2 * sizeof(float)];
const float right = *(be_t<float>*)&Memory[addr + (i * 2 + 1) * sizeof(float)]; const float right = *(be_t<float>*)&Memory[addr + (i * 2 + 1) * sizeof(float)];
mixdata[i*8+0] += left * 2; mixdata[i*8+0] += left;
mixdata[i*8+1] += right * 2; mixdata[i*8+1] += right;
} }
} }
else if (ch == 6) else if (ch == 6)