Skip to content

Commit

Permalink
修复多次链接会失败的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
dsafa22 committed Apr 24, 2019
1 parent d68110a commit a2c3c8e
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 25 deletions.
11 changes: 9 additions & 2 deletions app/src/main/cpp/lib/raop.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,20 @@ struct raop_s {
unsigned short port;
};

typedef enum {
SETUP_INITIAL,
SETUP_KEY,
SETUP_MIRROR_PORT,
SETUP_AUDIO_PORT
} setup_status_t;

struct raop_conn_s {
raop_t *raop;
raop_rtp_t *raop_rtp;
raop_rtp_mirror_t *raop_rtp_mirror;
fairplay_t *fairplay;
pairing_session_t *pairing;

setup_status_t setup_status;
unsigned char *local;
int locallen;

Expand All @@ -78,7 +85,7 @@ conn_init(void *opaque, unsigned char *local, int locallen, unsigned char *remot
conn->raop = raop;
conn->raop_rtp = NULL;
conn->fairplay = fairplay_init(raop->logger);
//fairplay_init2();
conn->setup_status = SETUP_INITIAL;
if (!conn->fairplay) {
free(conn);
return NULL;
Expand Down
27 changes: 11 additions & 16 deletions app/src/main/cpp/lib/raop_handlers.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,12 @@ raop_handler_options(raop_conn_t *conn,
http_response_add_header(response, "Public", "SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER");
}

static int setup = 0;

static void
raop_handler_setup(raop_conn_t *conn,
http_request_t *request, http_response_t *response,
char **response_data, int *response_datalen)
{
unsigned short remote_cport=0, remote_tport=0;
unsigned short remote_cport=0;

const char *transport;
char buffer[1024];
Expand Down Expand Up @@ -265,15 +263,14 @@ raop_handler_setup(raop_conn_t *conn,
use_udp = 0;
}


// 解析bplist
plist_t root_node = NULL;
plist_from_bin(data, datalen, &root_node);
plist_t streams_note = plist_dict_get_item(root_node, "streams");
if (setup == 0) {

if (conn->setup_status == SETUP_INITIAL) {
unsigned char aesiv[16];
unsigned char aeskey[16];
setup++;
logger_log(conn->raop->logger, LOGGER_DEBUG, "SETUP 1");
// 第一次setup
plist_t eiv_note = plist_dict_get_item(root_node, "eiv");
Expand All @@ -292,16 +289,16 @@ raop_handler_setup(raop_conn_t *conn,
plist_t time_note = plist_dict_get_item(root_node, "timingPort");
plist_get_uint_val(time_note, &timing_rport);
logger_log(conn->raop->logger, LOGGER_DEBUG, "timing_rport = %llu", timing_rport);
// ekey是72字节
// ekey是72字节,aeskey是16字节
int ret = fairplay_decrypt(conn->fairplay, ekey, aeskey);
logger_log(conn->raop->logger, LOGGER_DEBUG, "fairplay_decrypt ret = %d", ret);
unsigned char ecdh_secret[32];
pairing_get_ecdh_secret_key(conn->pairing, ecdh_secret);
conn->raop_rtp = raop_rtp_init(conn->raop->logger, &conn->raop->callbacks, conn->remote, conn->remotelen, aeskey, aesiv, ecdh_secret, timing_rport);
conn->raop_rtp_mirror = raop_rtp_mirror_init(conn->raop->logger, &conn->raop->callbacks, conn->remote, conn->remotelen, aeskey, ecdh_secret, timing_rport);
} else if (setup == 1) {
conn->setup_status = SETUP_KEY;
} else if (conn->setup_status == SETUP_KEY) {
unsigned short tport=0, dport=0;
setup++;
logger_log(conn->raop->logger, LOGGER_DEBUG, "SETUP 2");
plist_t stream_note = plist_array_get_item(streams_note, 0);
plist_t type_note = plist_dict_get_item(stream_note, "type");
Expand All @@ -312,11 +309,9 @@ raop_handler_setup(raop_conn_t *conn,
uint64_t streamConnectionID;
plist_get_uint_val(stream_id_note, &streamConnectionID);
logger_log(conn->raop->logger, LOGGER_DEBUG, "streamConnectionID = %llu", streamConnectionID);


if (conn->raop_rtp_mirror) {
raop_rtp_init_mirror_aes(conn->raop_rtp_mirror, streamConnectionID);
raop_rtp_start_mirror(conn->raop_rtp_mirror, use_udp, remote_tport, &tport, &dport);
raop_rtp_start_mirror(conn->raop_rtp_mirror, use_udp, &tport, &dport);
logger_log(conn->raop->logger, LOGGER_DEBUG, "RAOP initialized success");
} else {
logger_log(conn->raop->logger, LOGGER_ERR, "RAOP not initialized at SETUP, playing will fail!");
Expand Down Expand Up @@ -344,12 +339,12 @@ raop_handler_setup(raop_conn_t *conn,
memcpy(*response_data, rsp, len);
*response_datalen = len;
logger_log(conn->raop->logger, LOGGER_INFO, "dport = %d, tport = %d", dport, tport);
} else {
conn->setup_status = SETUP_MIRROR_PORT;
} else if (conn->setup_status == SETUP_MIRROR_PORT) {
logger_log(conn->raop->logger, LOGGER_DEBUG, "SETUP 3");
unsigned short cport = 0, tport = 0, dport = 0;

if (conn->raop_rtp) {
raop_rtp_start_audio(conn->raop_rtp, use_udp, remote_cport, remote_tport, &cport, &tport, &dport);
raop_rtp_start_audio(conn->raop_rtp, use_udp, remote_cport, &cport, &tport, &dport);
logger_log(conn->raop->logger, LOGGER_DEBUG, "RAOP initialized success");
} else {
logger_log(conn->raop->logger, LOGGER_ERR, "RAOP not initialized at SETUP, playing will fail!");
Expand Down Expand Up @@ -396,8 +391,8 @@ raop_handler_setup(raop_conn_t *conn,
*response_data = malloc(len);
memcpy(*response_data, rsp, len);
*response_datalen = len;

logger_log(conn->raop->logger, LOGGER_INFO, "dport = %d, tport = %d, cport = %d", dport, tport, cport);
conn->setup_status = SETUP_AUDIO_PORT;
}

}
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/cpp/lib/raop_rtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ raop_rtp_thread_udp(void *arg)

// 启动rtp服务,三个udp端口
void
raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport, unsigned short timing_rport,
raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport,
unsigned short *control_lport, unsigned short *timing_lport, unsigned short *data_lport)
{
logger_log(raop_rtp->logger, LOGGER_INFO, "raop_rtp_start_audio");
Expand All @@ -545,7 +545,6 @@ raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_r

/* Initialize ports and sockets */
raop_rtp->control_rport = control_rport;
//raop_rtp->timing_rport = timing_rport;
if (raop_rtp->remote_saddr.ss_family == AF_INET6) {
use_ipv6 = 1;
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/cpp/lib/raop_rtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ typedef struct h264codec_s h264codec_t;
raop_rtp_t *raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, const unsigned char *remote, int remotelen,
const unsigned char *aeskey, const unsigned char *aesiv, const unsigned char *ecdh_secret, unsigned short timing_rport);

void raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport, unsigned short timing_rport,
void raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport,
unsigned short *control_lport, unsigned short *timing_lport, unsigned short *data_lport);

void raop_rtp_set_volume(raop_rtp_t *raop_rtp, float volume);
Expand Down
5 changes: 2 additions & 3 deletions app/src/main/cpp/lib/raop_rtp_mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct raop_rtp_mirror_s {
int mirror_data_sock, mirror_time_sock;

unsigned short mirror_data_lport;
// client ntp port
unsigned short mirror_timing_rport;
unsigned short mirror_timing_lport;
};
Expand Down Expand Up @@ -470,7 +471,7 @@ raop_rtp_mirror_thread(void *arg)
}

void
raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned short mirror_timing_rport, unsigned short * mirror_timing_lport,
raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned short * mirror_timing_lport,
unsigned short *mirror_data_lport)
{
int use_ipv6 = 0;
Expand All @@ -482,8 +483,6 @@ raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned
MUTEX_UNLOCK(raop_rtp_mirror->run_mutex);
return;
}

//raop_rtp_mirror->mirror_timing_rport = mirror_timing_rport;
if (raop_rtp_mirror->remote_saddr.ss_family == AF_INET6) {
use_ipv6 = 1;
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/cpp/lib/raop_rtp_mirror.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ typedef struct h264codec_s h264codec_t;
raop_rtp_mirror_t *raop_rtp_mirror_init(logger_t *logger, raop_callbacks_t *callbacks, const unsigned char *remote, int remotelen,
const unsigned char *aeskey, const unsigned char *ecdh_secret, unsigned short timing_rport);
void raop_rtp_init_mirror_aes(raop_rtp_mirror_t *raop_rtp_mirror, uint64_t streamConnectionID);
void raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned short mirror_timing_rport, unsigned short * mirror_timing_lport,
void raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned short * mirror_timing_lport,
unsigned short *mirror_data_lport);

static int raop_rtp_init_mirror_sockets(raop_rtp_mirror_t *raop_rtp_mirror, int use_ipv6);
Expand Down

0 comments on commit a2c3c8e

Please sign in to comment.