1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cell/sysmodule.h>
#include <sys/process.h>
#include <sysutil/sysutil_avc2.h> /* for using AV Chat2 Utility */
#include <np.h> /* for using NP Matching */
#include <netex/net.h>
#include <netex/libnetctl.h>
#include <sysutil/sysutil_sysparam.h>
#define AVC2_PARAM_DEFAULT_MAX_PLAYERS (8)
#define AVC2_PARAM_DEFAULT_MAX_SPEAKERS (4)
/* state list */
enum EAVCState
{
AVC_STATE_IDLE = 0,
AVC_STATE_CHAT_INIT,
AVC_STATE_CHAT_LOAD,
AVC_STATE_CHAT_JOIN,
AVC_STATE_CHAT_SESSION_PROCESSING,
AVC_STATE_CHAT_LEAVE,
AVC_STATE_CHAT_RESET,
AVC_STATE_CHAT_UNLOAD,
AVC_STATE_EXIT,
};
/* event list */
enum EAVCEvent
{
AVC_EVENT_NON = AVC_STATE_EXIT + 1,
AVC_EVENT_EPSILON,
AVC_EVENT_LAN_DISCONNECT,
AVC_EVENT_ONLINE,
AVC_EVENT_OFFLINE,
AVC_EVENT_EXIT_GAME,
AVC_EVENT_ROOM_CREATE,
AVC_EVENT_ROOM_SEARCH,
AVC_EVENT_ERROR,
AVC_EVENT_FATAL_ERROR,
AVC_EVENT_NETDIALOG_FINISHED,
AVC_EVENT_NETDIALOG_UNLOADED,
AVC_EVENT_NP2_INIT_SUCCEEDED,
AVC_EVENT_NP2_FINALIZE_SUCCEEDED,
AVC_EVENT_NP2_START_CONTEXT_SUCCEEDED,
AVC_EVENT_NP2_STOP_CONTEXT_SUCCEEDED,
AVC_EVENT_NP2_ROOM_DESTROY_OR_KICKEDOUT,
AVC_EVENT_NP2_ROOM_MEMBER_LEFT,
AVC_EVENT_NP2_ROOM_MEMBER_JOINED,
AVC_EVENT_CHAT_LOAD_SUCCEEDED,
AVC_EVENT_CHAT_LOAD_FAILED,
AVC_EVENT_CHAT_JOIN_SUCCEEDED,
AVC_EVENT_CHAT_JOIN_FAILED,
AVC_EVENT_CHAT_LEAVE_SUCCEEDED,
AVC_EVENT_CHAT_LEAVE_FAILED,
AVC_EVENT_CHAT_UNLOAD_SUCCEEDED,
AVC_EVENT_CHAT_UNLOAD_FAILED,
AVC_EVENT_CHAT_INIT_SUCCEEDED,
AVC_EVENT_CHAT_FINALIZE_SUCCEEDED,
AVC_EVENT_CHAT_SESSION_STOPPED,
AVC_EVENT_CREATE_JOIN_ROOM_SUCCEEDED,
AVC_EVENT_SEARCH_ROOM_SUCCEEDED,
AVC_EVENT_JOIN_ROOM_SUCCEEDED,
AVC_EVENT_LEAVE_ROOM_SUCCEEDED,
AVC_EVENT_SIGNALING_ESTABLISHED,
AVC_EVENT_SIGNALING_DEAD,
AVC_EVENT_UI_CLOSE_SUCCEEDED,
};
typedef struct
{
int state;
int event;
int (*func)(void);
EAVCState new_state;
} state_transition_table;
class SonyVoiceChat
{
public:
static void init(SQRNetworkManager_PS3* pNetMan);
static void shutdown();
static void tick();
static void setEnabled(bool bEnabled);
static bool hasMicConnected(const SceNpMatching2RoomMemberId *players_id);
static bool isTalking(SceNpMatching2RoomMemberId* players_id);
static void mute(bool bMute); //Turn chat audio on or off
static void mutePlayer(const SceNpMatching2RoomMemberId member_id, bool bMute); //Turn chat audio from a specified player on or off;
static void muteLocalPlayer(bool bMute); //Turn microphone input on or off;
static bool isMuted();
static bool isMutedPlayer(const SceNpMatching2RoomMemberId member_id);
static bool isMutedLocalPlayer(); //Turn microphone input on or off;
static void setVolume(float vol); // 0.0f - 1.0f range
static float getVolume(); // 0.0f - 1.0f range
static bool isShuttingDown() { return (sm_state == AVC_STATE_CHAT_LEAVE || sm_state == AVC_STATE_CHAT_UNLOAD || AVC_STATE_CHAT_RESET); }
static void signalRoomDestroyed() { if(!isShuttingDown()) sm_event = AVC_EVENT_NP2_ROOM_DESTROY_OR_KICKEDOUT;}
static void signalRoomKickedOut() { if(!isShuttingDown()) sm_event = AVC_EVENT_NP2_ROOM_DESTROY_OR_KICKEDOUT;}
static void signalDisconnected() { if(!isShuttingDown()) sm_event = AVC_EVENT_LAN_DISCONNECT;}
private:
// static np2_matching2_info sm_matchingInfo;
static EAVCEvent sm_event;
static EAVCState sm_state;
static SQRNetworkManager_PS3* sm_pNetworkManager;
static bool sm_bEnabled;
static uint8_t sm_micStatus;
static bool sm_bLoaded;
static bool sm_bUnloading;
static unordered_map<SceNpMatching2RoomMemberId, bool> sm_bTalkingMap;
static bool sm_bCanStart; // set to true on init, false on disconnect, used to see if we should start after a re-enable
static bool sm_isChatRestricted; // true if the parental controls have been set on the main users account
static int sm_currentBitrate;
static int eventcb_load(CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static int eventcb_join(CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static int eventcb_leave( CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static int eventcb_unload(CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static int eventcb_voiceDetected(CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static void eventcb( CellSysutilAvc2EventId event_id, CellSysutilAvc2EventParam event_param, void *userdata);
static int initialize();
static int finalize();
static int load();
static int unload();
static int join();
static int leave();
static int start();
static int stop();
static int startStream();
static int stopStream();
// static int update_target();
static void do_state_transition( state_transition_table *tbl, int tbl_size);
static int invoke_epsilon_event();
static void setBitRate();
static void setEvent(EAVCEvent event);
static void setState(EAVCState state);
static void printStateAndEvent();
};
|