Skip to content

Commit 6b6fe5b

Browse files
overdrivenpotatosajattack
authored andcommitted
Add PSP user mode API
1 parent 9f581e6 commit 6b6fe5b

28 files changed

+5145
-0
lines changed

src/psp/atrac.rs

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
use super::c_void;
2+
3+
#[repr(C)]
4+
#[derive(Copy, Clone)]
5+
pub struct Atrac3BufferInfo {
6+
pub puc_write_position_first_buf: *mut u8,
7+
pub ui_writable_byte_first_buf: u32,
8+
pub ui_min_write_byte_first_buf: u32,
9+
pub ui_read_position_first_buf: u32,
10+
pub puc_write_position_second_buf: *mut u8,
11+
pub ui_writable_byte_second_buf: u32,
12+
pub ui_min_write_byte_second_buf: u32,
13+
pub ui_read_position_second_buf: u32,
14+
}
15+
16+
extern {
17+
pub fn sceAtracGetAtracID(ui_codec_type: u32) -> i32;
18+
pub fn sceAtracSetDataAndGetID(
19+
buf: *mut c_void,
20+
bufsize: usize,
21+
) -> i32;
22+
pub fn sceAtracDecodeData(
23+
atrac_id: i32,
24+
out_samples: *mut u16,
25+
out_n: *mut i32,
26+
out_end: *mut i32,
27+
out_remain_frame: *mut i32,
28+
) -> i32;
29+
pub fn sceAtracGetRemainFrame(
30+
atrac_id: i32,
31+
out_remain_frame: *mut i32,
32+
) -> i32;
33+
pub fn sceAtracGetStreamDataInfo(
34+
atrac_id: i32,
35+
write_pointer: *mut *mut u8,
36+
available_bytes: *mut u32,
37+
read_offset: *mut u32,
38+
) -> i32;
39+
pub fn sceAtracAddStreamData(
40+
atrac_id: i32,
41+
bytes_to_add: u32,
42+
) -> i32;
43+
pub fn sceAtracGetBitrate(
44+
atrac_id: i32,
45+
out_bitrate: *mut i32,
46+
) -> i32;
47+
pub fn sceAtracSetLoopNum(
48+
atrac_id: i32,
49+
nloops: i32,
50+
) -> i32;
51+
pub fn sceAtracReleaseAtracID(atrac_id: i32) -> i32;
52+
pub fn sceAtracGetNextSample(
53+
atrac_id: i32,
54+
out_n: *mut i32,
55+
) -> i32;
56+
pub fn sceAtracGetMaxSample(
57+
atrac_id: i32,
58+
out_max: *mut i32,
59+
) -> i32;
60+
pub fn sceAtracGetBufferInfoForReseting(
61+
atrac_id: i32,
62+
ui_sample: u32,
63+
pbuffer_info: *mut Atrac3BufferInfo,
64+
) -> i32;
65+
pub fn sceAtracGetChannel(
66+
atrac_id: i32,
67+
pui_channel: *mut u32,
68+
) -> i32;
69+
pub fn sceAtracGetInternalErrorInfo(
70+
atrac_id: i32,
71+
pi_result: *mut i32,
72+
) -> i32;
73+
pub fn sceAtracGetLoopStatus(
74+
atrac_id: i32,
75+
pi_loop_num: *mut i32,
76+
pui_loop_status: *mut u32,
77+
) -> i32;
78+
pub fn sceAtracGetNextDecodePosition(
79+
atrac_id: i32,
80+
pui_sample_position: *mut u32,
81+
) -> i32;
82+
pub fn sceAtracGetSecondBufferInfo(
83+
atrac_id: i32,
84+
pui_position: *mut u32,
85+
pui_data_byte: *mut u32,
86+
) -> i32;
87+
pub fn sceAtracGetSoundSample(
88+
atrac_id: i32,
89+
pi_end_sample: *mut i32,
90+
pi_loop_start_sample: *mut i32,
91+
pi_loop_end_sample: *mut i32,
92+
) -> i32;
93+
pub fn sceAtracResetPlayPosition(
94+
atrac_id: i32,
95+
ui_sample: u32,
96+
ui_write_byte_first_buf: u32,
97+
ui_write_byte_second_buf: u32,
98+
) -> i32;
99+
pub fn sceAtracSetData(
100+
atrac_id: i32,
101+
puc_buffer_addr: *mut u8,
102+
ui_buffer_byte: u32,
103+
) -> i32;
104+
pub fn sceAtracSetHalfwayBuffer(
105+
atrac_id: i32,
106+
puc_buffer_addr: *mut u8,
107+
ui_read_byte: u32,
108+
ui_buffer_byte: u32,
109+
) -> i32;
110+
pub fn sceAtracSetHalfwayBufferAndGetID(
111+
puc_buffer_addr: *mut u8,
112+
ui_read_byte: u32,
113+
ui_buffer_byte: u32,
114+
) -> i32;
115+
pub fn sceAtracSetSecondBuffer(
116+
atrac_id: i32,
117+
puc_second_buffer_addr: *mut u8,
118+
ui_second_buffer_byte: u32,
119+
) -> i32;
120+
}

src/psp/audio.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use super::c_void;
2+
3+
pub const AUDIO_VOLUME_MAX: u32 = 0x8000;
4+
pub const AUDIO_CHANNEL_MAX: u32 = 8;
5+
pub const AUDIO_NEXT_CHANNEL: i32 = -1;
6+
pub const AUDIO_SAMPLE_MIN: u32 = 64;
7+
pub const AUDIO_SAMPLE_MAX: u32 = 65472;
8+
9+
#[derive(Copy, Clone)]
10+
#[repr(u32)]
11+
pub enum AudioFormat {
12+
Stereo = 0,
13+
Mono = 0x10,
14+
}
15+
16+
#[derive(Copy, Clone)]
17+
#[repr(C)]
18+
pub struct AudioInputParams {
19+
pub unknown1: i32,
20+
pub gain: i32,
21+
pub unknown2: i32,
22+
pub unknown3: i32,
23+
pub unknown4: i32,
24+
pub unknown5: i32,
25+
}
26+
27+
#[derive(Copy, Clone)]
28+
#[repr(i32)]
29+
pub enum AudioOutputFrequency {
30+
Khz48 = 48000,
31+
Khz44_1 = 44100,
32+
Khz32 = 32000,
33+
Khz24 = 24000,
34+
Khz22_05 = 22050,
35+
Khz16 = 16000,
36+
Khz12 = 12000,
37+
Khz11_025 = 11025,
38+
Khz8 = 8000,
39+
}
40+
41+
#[derive(Copy, Clone)]
42+
#[repr(i32)]
43+
pub enum AudioInputFrequency {
44+
Khz44_1 = 44100,
45+
Khz22_05 = 22050,
46+
Khz11_025 = 11025,
47+
}
48+
49+
extern {
50+
pub fn sceAudioChReserve(channel: i32, sample_count: i32, format: AudioFormat) -> i32;
51+
pub fn sceAudioChRelease(channel: i32) -> i32;
52+
pub fn sceAudioOutput(channel: i32, vol: i32, buf: *mut c_void) -> i32;
53+
pub fn sceAudioOutputBlocking(channel: i32, vol: i32, buf: *mut c_void) -> i32;
54+
pub fn sceAudioOutputPanned(channel: i32, left_vol: i32, right_vol: i32, buf: *mut c_void) -> i32;
55+
pub fn sceAudioOutputPannedBlocking(channel: i32, left_vol: i32, right_vol: i32, buf: *mut c_void) -> i32;
56+
pub fn sceAudioGetChannelRestLen(channel: i32) -> i32;
57+
pub fn sceAudioGetChannelRestLength(channel: i32) -> i32;
58+
pub fn sceAudioSetChannelDataLen(channel: i32, sample_count: i32) -> i32;
59+
pub fn sceAudioChangeChannelConfig(channel: i32, format: AudioFormat) -> i32;
60+
pub fn sceAudioChangeChannelVolume(channel:i32, left_vol: i32, right_vol:i32) -> i32;
61+
pub fn sceAudioOutput2Reserve(sample_count: i32) -> i32;
62+
pub fn sceAudioOutput2Release() -> i32;
63+
pub fn sceAudioOutput2ChangeLength(sample_count: i32) -> i32;
64+
pub fn sceAudioOutput2OutputBlocking(vol: i32, buf: *mut c_void) -> i32;
65+
pub fn sceAudioOutput2GetRestSample() -> i32;
66+
pub fn sceAudioSRCChReserve(sample_count: i32, freq: AudioOutputFrequency, channels: i32) -> i32;
67+
pub fn sceAudioSRCChRelease() -> i32;
68+
pub fn sceAudioSRCOutputBlocking(vol: i32, buf: *mut c_void) -> i32;
69+
pub fn sceAudioInputInit(unknown1: i32, gain: i32, unknown2: i32) -> i32;
70+
pub fn sceAudioInputInitEx(params: *mut AudioInputParams) -> i32;
71+
pub fn sceAudioInputBlocking(sample_count: i32, freq: AudioInputFrequency, buf: *mut c_void);
72+
pub fn sceAudioInput(sample_count: i32, freq: AudioInputFrequency, buf: *mut c_void);
73+
pub fn sceAudioGetInputLength() -> i32;
74+
pub fn sceAudioWaitInputEnd() -> i32;
75+
pub fn sceAudioPollInputEnd() -> i32;
76+
}

src/psp/codec.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
extern {
2+
pub fn sceVideocodecOpen(
3+
buffer: *mut u32,
4+
type_: i32,
5+
) -> i32;
6+
pub fn sceVideocodecGetEDRAM(
7+
buffer: *mut u32,
8+
type_: i32,
9+
) -> i32;
10+
pub fn sceVideocodecInit(
11+
buffer: *mut u32,
12+
type_: i32,
13+
) -> i32;
14+
pub fn sceVideocodecDecode(
15+
buffer: *mut u32,
16+
type_: i32,
17+
) -> i32;
18+
pub fn sceVideocodecReleaseEDRAM(buffer: *mut u32) -> i32;
19+
}
20+
21+
pub enum AudioCodec {
22+
At3Plus = 0x00001000,
23+
At3 = 0x00001001,
24+
Mp3 = 0x00001002,
25+
Aac = 0x00001003,
26+
}
27+
28+
extern {
29+
pub fn sceAudiocodecCheckNeedMem(
30+
buffer: *mut u32,
31+
type_: i32,
32+
) -> i32;
33+
pub fn sceAudiocodecInit(
34+
buffer: *mut u32,
35+
type_: i32,
36+
) -> i32;
37+
pub fn sceAudiocodecDecode(
38+
buffer: *mut u32,
39+
type_: i32,
40+
) -> i32;
41+
pub fn sceAudiocodecGetEDRAM(
42+
buffer: *mut u32,
43+
type_: i32,
44+
) -> i32;
45+
pub fn sceAudiocodecReleaseEDRAM(buffer: *mut u32) -> i32;
46+
}

src/psp/ctrl.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
pub const PSP_CTRL_SELECT: i32 = 0x000001;
2+
pub const PSP_CTRL_START: i32 = 0x000008;
3+
pub const PSP_CTRL_UP: i32 = 0x000010;
4+
pub const PSP_CTRL_RIGHT: i32 = 0x000020;
5+
pub const PSP_CTRL_DOWN: i32 = 0x000040;
6+
pub const PSP_CTRL_LEFT: i32 = 0x000080;
7+
pub const PSP_CTRL_LTRIGGER: i32 = 0x000100;
8+
pub const PSP_CTRL_RTRIGGER: i32 = 0x000200;
9+
pub const PSP_CTRL_TRIANGLE: i32 = 0x001000;
10+
pub const PSP_CTRL_CIRCLE: i32 = 0x002000;
11+
pub const PSP_CTRL_CROSS: i32 = 0x004000;
12+
pub const PSP_CTRL_SQUARE: i32 = 0x008000;
13+
pub const PSP_CTRL_HOME: i32 = 0x010000;
14+
pub const PSP_CTRL_HOLD: i32 = 0x020000;
15+
pub const PSP_CTRL_NOTE: i32 = 0x800000;
16+
pub const PSP_CTRL_SCREEN: i32 = 0x400000;
17+
pub const PSP_CTRL_VOLUP: i32 = 0x100000;
18+
pub const PSP_CTRL_VOLDOWN: i32 = 0x200000;
19+
pub const PSP_CTRL_WLAN_UP: i32 = 0x040000;
20+
pub const PSP_CTRL_REMOTE: i32 = 0x080000;
21+
pub const PSP_CTRL_DISC: i32 = 0x1000000;
22+
pub const PSP_CTRL_MS: i32 = 0x2000000;
23+
#[derive(Copy, Clone)]
24+
#[repr(u32)]
25+
pub enum CtrlMode {
26+
Digital = 0,
27+
Analaog
28+
}
29+
30+
#[derive(Copy, Clone)]
31+
#[repr(C)]
32+
pub struct SceCtrlData {
33+
pub timestamp: u32,
34+
pub buttons: i32,
35+
pub lx: u8,
36+
pub ly: u8,
37+
pub rsrv: [u8;
38+
6],
39+
}
40+
41+
#[derive(Copy, Clone)]
42+
#[repr(C)]
43+
pub struct SceCtrlLatch {
44+
pub ui_make: u32,
45+
pub ui_break: u32,
46+
pub ui_press: u32,
47+
pub ui_release: u32,
48+
}
49+
50+
extern {
51+
pub fn sceCtrlSetSamplingCycle(cycle: i32) -> i32;
52+
pub fn sceCtrlGetSamplingCycle(pcycle: *mut i32) -> i32;
53+
pub fn sceCtrlSetSamplingMode(mode: CtrlMode) -> i32;
54+
pub fn sceCtrlGetSamplingMode(pmode: *mut i32) -> i32;
55+
pub fn sceCtrlPeekBufferPositive(pad_data: *mut SceCtrlData, count: i32) -> i32;
56+
pub fn sceCtrlPeekBufferNegative(pad_data: *mut SceCtrlData, count: i32) -> i32;
57+
pub fn sceCtrlReadBufferPositive(pad_data: *mut SceCtrlData, count: i32) -> i32;
58+
pub fn sceCtrlReadBufferNegative(pad_data: *mut SceCtrlData, count: i32) -> i32;
59+
pub fn sceCtrlPeekLatch(latch_data: *mut SceCtrlLatch) -> i32;
60+
pub fn sceCtrlReadLatch(latch_data: *mut SceCtrlLatch) -> i32;
61+
pub fn sceCtrlSetIdleCancelThreshold(idlereset: i32, idleback: i32) -> i32;
62+
pub fn sceCtrlGetIdleCancelThreshold(idlereset: *mut i32, idleback: *mut i32) -> i32;
63+
}

src/psp/display.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use super::c_void;
2+
3+
#[derive(Clone, Copy)]
4+
#[repr(u32)]
5+
pub enum DisplayMode {
6+
Lcd = 0,
7+
}
8+
9+
#[derive(Copy, Clone)]
10+
#[repr(u32)]
11+
pub enum DisplayPixelFormat {
12+
Psm5650 = 0,
13+
Psm5551 = 1,
14+
Psm4444 = 2,
15+
Psm8888 = 3,
16+
}
17+
18+
#[derive(Clone, Copy)]
19+
#[repr(u32)]
20+
pub enum DisplaySetBufSync {
21+
Immediate = 0,
22+
NextFrame = 1,
23+
}
24+
25+
extern {
26+
pub fn sceDisplaySetMode(mode: DisplayMode, width: usize, height: usize) -> u32;
27+
pub fn sceDisplayGetMode(pmode: *mut i32, pwidth: *mut i32, pheight: *mut i32) -> i32;
28+
pub fn sceDisplaySetFrameBuf(
29+
top_addr: *const u8,
30+
buffer_width: usize,
31+
pixel_format: DisplayPixelFormat,
32+
sync: DisplaySetBufSync,
33+
) -> u32;
34+
pub fn sceDisplayGetFrameBuf(
35+
top_addr: *mut *mut c_void,
36+
buffer_width: *mut usize,
37+
pixel_format: *mut DisplayPixelFormat,
38+
sync: DisplaySetBufSync,
39+
) -> i32;
40+
pub fn sceDisplayGetVcount() -> u32;
41+
pub fn sceDisplayWaitVblank() -> i32;
42+
pub fn sceDisplayWaitVblankCB() -> i32;
43+
pub fn sceDisplayWaitVblankStart() -> i32;
44+
pub fn sceDisplayWaitVblankStartCB() -> i32;
45+
pub fn sceDisplayGetAccumulatedHcount() -> i32;
46+
pub fn sceDisplayGetCurrentHcount() -> i32;
47+
pub fn sceDisplayGetFramePerSec() -> f32;
48+
pub fn sceDisplayIsForeground() -> i32;
49+
pub fn sceDisplayIsVblank() -> i32;
50+
}

0 commit comments

Comments
 (0)