>>MediaPlayerService.cpp
status_t MediaPlayerService::Client::pause()
{ALOGV("[%d] pause", mConnId);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
MM_LOGI("[%d] pause", mConnId);
return p-> pause();
}
>>NuPlayer.cpp
void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
......
case kWhatPause:
{
if (mSource != NULL) {
mSource->pause();
} else {
ALOGW("pause called when source is gone or not set");
}
if (mRenderer != NULL) {
mRenderer->pause();
} else {
ALOGW("pause called when renderer is gone or not set");
}
break;
}
......
}
>>NuPlayer.cpp
void NuPlayer::pause() {
(new AMessage(kWhatPause, id()))->post();
}
>>RTSPSource.cpp
void NuPlayer::RTSPSource::pause() {
int64_t mediaDurationUs = 0;
getDuration(&mediaDurationUs);
for (size_t index = 0; index < mTracks.size(); index++) {
TrackInfo *info = &mTracks.editItemAt(index);
sp<AnotherPacketSource> source = info->mSource;
// Check if EOS or ERROR is received
if (source != NULL && source->isFinished(mediaDurationUs)) {
return;
}
}
mHandler->pause();
}
>>MyHandler.h
void pause() {
sp<AMessage> msg = new AMessage('paus', id());
mPauseGeneration++;
msg->setInt32("pausecheck", mPauseGeneration);
msg->post(kPauseDelayUs);
}
>>MyHandler.h
virtual void onMessageReceived(const sp<AMessage> &msg) {
......
case 'paus':
{
int32_t generation;
CHECK(msg->findInt32("pausecheck", &generation));
if (generation != mPauseGeneration) {
ALOGV("Ignoring outdated pause message.");
break;
}
if (!mSeekable) {
ALOGW("This is a live stream, ignoring pause request.");
break;
}
mCheckPending = true;
++mCheckGeneration;
mPausing = true;
AString request = "PAUSE ";
request.append(mControlURL);
request.append(" RTSP/1.0\r\n");
request.append("Session: ");
request.append(mSessionID);
request.append("\r\n");
request.append("\r\n");
sp<AMessage> reply = new AMessage('pau2', id());
mConn->sendRequest(request.c_str(), reply);
break;
}
......
}
>>ARTSPConnection.cpp
void ARTSPConnection::sendRequest(
const char *request, const sp<AMessage> &reply) {
sp<AMessage> msg = new AMessage(kWhatSendRequest, id());
msg->setString("request", request);
msg->setMessage("reply", reply);
msg->post();
}
>>ARTSPConnection.cpp
void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {
case kWhatSendRequest:
onSendRequest(msg);
break;
......
}
void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) {
sp<AMessage> reply;
CHECK(msg->findMessage("reply", &reply));
if (mState != CONNECTED) {
reply->setInt32("result", -ENOTCONN);
reply->post();
return;
}
AString request;
CHECK(msg->findString("request", &request));
// Just in case we need to re-issue the request with proper authentication
// later, stash it away.
reply->setString("original-request", request.c_str(), request.size());
addAuthentication(&request);
addUserAgent(&request);
// Find the boundary between headers and the body.
ssize_t i = request.find("\r\n\r\n");
CHECK_GE(i, 0);
int32_t cseq = mNextCSeq++;
AString cseqHeader = "CSeq: ";
cseqHeader.append(cseq);
cseqHeader.append("\r\n");
request.insert(cseqHeader, i + 2);
ALOGV("request: '%s'", request.c_str());
size_t numBytesSent = 0;
while (numBytesSent < request.size()) {
ssize_t n =
send(mSocket, request.c_str() + numBytesSent,
request.size() - numBytesSent, 0);
if (n < 0 && errno == EINTR) {
continue;
}
if (n <= 0) {
performDisconnect();
if (n == 0) {
// Server closed the connection.
ALOGE("Server unexpectedly closed the connection.");
reply->setInt32("result", ERROR_IO);
reply->post();
} else {
ALOGE("Error sending rtsp request. (%s)", strerror(errno));
reply->setInt32("result", -errno);
reply->post();
}
return;
}
numBytesSent += (size_t)n;
}
mPendingRequests.add(cseq, reply);
}