void MainScene::onContactSeperate(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if(typeA == Player::PlayerType::PLAYER) { // only one player so ShapeB must belong to an enemy log("leave enemy!"); playerB->setCanAttack(false); } if(typeB == Player::PlayerType::PLAYER) { // only one player so ShapeA must belong to an enemy log("leave enemy!"); playerA->setCanAttack(false); } }
bool MainScene::onContactBegin(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeB()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if(typeA == Player::PlayerType::PLAYER) { // only one player so ShapeB must belong to an enemy log("contact enemy!"); playerB->setCanAttack(true); } if(typeB == Player::PlayerType::PLAYER) { // only one player so ShapeA must belong to an enemy log("contact enemy!"); playerA->setCanAttack(true); } return true; }
void Brave::onContactSeperate(const PhysicsContact& contact) { auto playerA = (Player*)contact.getShapeA()->getBody()->getNode(); auto playerB = (Player*)contact.getShapeA()->getBody()->getNode(); auto typeA = playerA->getPlayerType(); auto typeB = playerB->getPlayerType(); if (typeA==Player::PlayerType::PLAYER) { log("lave enemy!"); playerB->setCanAttack(false); playerA->removeAttacker(playerB); } if (typeB == Player::PlayerType::PLAYER) { log("leave enemy!"); playerA->setCanAttack(false); playerB->removeAttacker(playerA); } }
sp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) { LOGV("decode(%s)", url); sp<MemoryBase> mem; sp<MediaPlayerBase> player; // Protect our precious, precious DRMd ringtones by only allowing // decoding of http, but not filesystem paths or content Uris. // If the application wants to decode those, it should open a // filedescriptor for them and use that. if (url != NULL && strncmp(url, "http://", 7) != 0) { LOGD("Can't decode %s by path, use filedescriptor instead", url); return mem; } player_type playerType = getPlayerType(url); LOGV("player type = %d", playerType); // create the right type of player sp<AudioCache> cache = new AudioCache(url); player = android::createPlayer(playerType, cache.get(), cache->notify); if (player == NULL) goto Exit; if (player->hardwareOutput()) goto Exit; static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); // set data source if (player->setDataSource(url) != NO_ERROR) goto Exit; LOGV("prepare"); player->prepareAsync(); LOGV("wait for prepare"); if (cache->wait() != NO_ERROR) goto Exit; LOGV("start"); player->start(); LOGV("wait for playback complete"); if (cache->wait() != NO_ERROR) goto Exit; mem = new MemoryBase(cache->getHeap(), 0, cache->size()); *pSampleRate = cache->sampleRate(); *pNumChannels = cache->channelCount(); *pFormat = cache->format(); LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); Exit: if (player != 0) player->reset(); return mem; }
status_t MetadataRetrieverClient::setDataSource(const char *url) { LOGV("setDataSource(%s)", url); Mutex::Autolock lock(mLock); if (url == NULL) { return UNKNOWN_ERROR; } player_type playerType = getPlayerType(url); LOGV("player type = %d", playerType); sp<MediaMetadataRetrieverBase> p = createRetriever(playerType); if (p == NULL) return NO_INIT; status_t ret = p->setDataSource(url); if (ret == NO_ERROR) mRetriever = p; return ret; }
sp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) { LOGV("decode(%d, %lld, %lld)", fd, offset, length); sp<MemoryBase> mem; sp<MediaPlayerBase> player; player_type playerType = getPlayerType(fd, offset, length); LOGV("player type = %d", playerType); // create the right type of player sp<AudioCache> cache = new AudioCache("decode_fd"); player = android::createPlayer(playerType, cache.get(), cache->notify); if (player == NULL) goto Exit; if (player->hardwareOutput()) goto Exit; static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); // set data source if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; LOGV("prepare"); player->prepareAsync(); LOGV("wait for prepare"); if (cache->wait() != NO_ERROR) goto Exit; LOGV("start"); player->start(); LOGV("wait for playback complete"); if (cache->wait() != NO_ERROR) goto Exit; mem = new MemoryBase(cache->getHeap(), 0, cache->size()); *pSampleRate = cache->sampleRate(); *pNumChannels = cache->channelCount(); *pFormat = cache->format(); LOGV("return memory @ %p, sampleRate=%u, channelCount = %d, format = %d", mem->pointer(), *pSampleRate, *pNumChannels, *pFormat); Exit: if (player != 0) player->reset(); ::close(fd); return mem; }
status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length) { LOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); struct stat sb; int ret = fstat(fd, &sb); if (ret != 0) { LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); return UNKNOWN_ERROR; } LOGV("st_dev = %llu", sb.st_dev); LOGV("st_mode = %u", sb.st_mode); LOGV("st_uid = %lu", sb.st_uid); LOGV("st_gid = %lu", sb.st_gid); LOGV("st_size = %llu", sb.st_size); if (offset >= sb.st_size) { LOGE("offset error"); ::close(fd); return UNKNOWN_ERROR; } if (offset + length > sb.st_size) { length = sb.st_size - offset; LOGV("calculated length = %lld", length); } player_type playerType = getPlayerType(fd, offset, length); LOGV("player type = %d", playerType); // create the right type of player sp<MediaPlayerBase> p = createPlayer(playerType); if (p == NULL) return NO_INIT; if (!p->hardwareOutput()) { mAudioOutput = new AudioOutput(); static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); } // now set data source mStatus = p->setDataSource(fd, offset, length); if (mStatus == NO_ERROR) mPlayer = p; return mStatus; }
status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t length) { LOGV("setDataSource fd=%d, offset=%lld, length=%lld", fd, offset, length); Mutex::Autolock lock(mLock); struct stat sb; int ret = fstat(fd, &sb); if (ret != 0) { LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); return BAD_VALUE; } LOGV("st_dev = %llu", sb.st_dev); LOGV("st_mode = %u", sb.st_mode); LOGV("st_uid = %lu", sb.st_uid); LOGV("st_gid = %lu", sb.st_gid); LOGV("st_size = %llu", sb.st_size); if (offset >= sb.st_size) { LOGE("offset (%lld) bigger than file size (%llu)", offset, sb.st_size); ::close(fd); return BAD_VALUE; } if (offset + length > sb.st_size) { length = sb.st_size - offset; LOGV("calculated length = %lld", length); } player_type playerType = getPlayerType(fd, offset, length); LOGV("player type = %d", playerType); sp<MediaMetadataRetrieverBase> p = createRetriever(playerType); if (p == NULL) { ::close(fd); return NO_INIT; } status_t status = p->setMode(mMode); if (status == NO_ERROR) { p->setDataSource(fd, offset, length); } if (status == NO_ERROR) mRetriever = p; ::close(fd); return status; }
status_t MediaPlayerService::Client::setDataSource(const char *url) { LOGV("setDataSource(%s)", url); if (url == NULL) return UNKNOWN_ERROR; if (strncmp(url, "content://", 10) == 0) { // get a filedescriptor for the content Uri and // pass it to the setDataSource(fd) method String16 url16(url); int fd = android::openContentProviderFile(url16); if (fd < 0) { LOGE("Couldn't open fd for %s", url); return UNKNOWN_ERROR; } setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus close(fd); return mStatus; } else { player_type playerType = getPlayerType(url); LOGV("player type = %d", playerType); // create the right type of player sp<MediaPlayerBase> p = createPlayer(playerType); if (p == NULL) return NO_INIT; if (!p->hardwareOutput()) { mAudioOutput = new AudioOutput(); static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput); } // now set data source LOGV(" setDataSource"); mStatus = p->setDataSource(url); if (mStatus == NO_ERROR) mPlayer = p; return mStatus; } }