Skip to content

Commit

Permalink
feat(mac): add sync player
Browse files Browse the repository at this point in the history
  • Loading branch information
skufly authored and pingkai committed Apr 30, 2020
1 parent 02cf374 commit c854037
Show file tree
Hide file tree
Showing 13 changed files with 351 additions and 5 deletions.
8 changes: 8 additions & 0 deletions platform/Apple/source/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ link_directories(${SRC_LIBRARIES_DIR})
set(SOURCE_LIST
CicadaPlayer.mm
CicadaPlayer.h
CicadaSyncPlayerServer.h
CicadaSyncPlayerServer.mm
CicadaSyncPlayerClient.h
CicadaSyncPlayerClient.mm
playerMessage.h
playerMessage.cpp
CicadaPlayerGlobalSettings.h
CicadaPlayerGlobalSettings.mm
CicadaPlayerSDK.h
Expand Down Expand Up @@ -85,6 +91,8 @@ target_include_directories(CicadaPlayerSDK PUBLIC ${PROJECT_SOURCE_DIR})
set_source_files_properties(${XIB_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
set(PUBLIC_HEADERS
CicadaPlayer.h
CicadaSyncPlayerServer.h
CicadaSyncPlayerClient.h
CicadaPlayerGlobalSettings.h
CicadaConfig.h
CicadaCacheConfig.h
Expand Down
6 changes: 6 additions & 0 deletions platform/Apple/source/CicadaOCHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@ class CicadaOCHelper {
CicadaOCHelper(CicadaPlayer * player):mPlayer(player){}
void getListener(playerListener &listener);

void setDelegate(__weak id<CicadaDelegate> innerDelegate) {
mInnerDelegate = innerDelegate;
}

static CicadaTrackInfo* getCicadaTrackInfo(const StreamInfo *info);
static CicadaImage * convertBitmapRGBA8ToUIImage(unsigned char *buffer, int width, int height);

protected:
static CicadaPlayer * getOCPlayer(void *userData);
static id<CicadaDelegate> getDelegate(void *userData);

static void onError(int64_t code, const void *msg, /*void *extra, */void *userData);

Expand Down Expand Up @@ -70,6 +75,7 @@ class CicadaOCHelper {

private:
__weak CicadaPlayer * mPlayer = nullptr;
__weak id<CicadaDelegate> mInnerDelegate = nil;
};


Expand Down
32 changes: 28 additions & 4 deletions platform/Apple/source/CicadaOCHelper.mm
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,25 @@
return helper->mPlayer;
}

id<CicadaDelegate> CicadaOCHelper::getDelegate(void *userData)
{
CicadaOCHelper *helper = (CicadaOCHelper *)userData;
if (nullptr == helper) {
return nil;
}
return helper->mInnerDelegate;
}

void CicadaOCHelper::onPrepared(void *userData) {
__weak CicadaPlayer * player = getOCPlayer(userData);
__weak id<CicadaDelegate> theDelegate = getDelegate(userData);

dispatch_async(dispatch_get_main_queue(), ^{
player.duration = 0; // setDuration will overwrite the value
if (theDelegate && [theDelegate respondsToSelector:@selector(onPlayerEvent:eventType:)]) {
[theDelegate onPlayerEvent:player eventType:CicadaEventPrepareDone];
}

if (player.delegate && [player.delegate respondsToSelector:@selector(onPlayerEvent:eventType:)]){
[player.delegate onPlayerEvent:player eventType:CicadaEventPrepareDone];
}
Expand Down Expand Up @@ -238,11 +253,15 @@

void CicadaOCHelper::onCurrentPositionUpdate(int64_t position, void *userData) {
__weak CicadaPlayer * player = getOCPlayer(userData);
__weak id<CicadaDelegate> theDelegate = getDelegate(userData);
dispatch_async(dispatch_get_main_queue(), ^{
[player setCurrentPosition:position];
if (player.delegate && [player.delegate respondsToSelector:@selector(onCurrentPositionUpdate:position:)]) {
[player.delegate onCurrentPositionUpdate:player position:position];
}
if (theDelegate && [theDelegate respondsToSelector:@selector(onCurrentPositionUpdate:position:)]) {
[theDelegate onCurrentPositionUpdate:player position:position];
}
});
}

Expand Down Expand Up @@ -410,11 +429,16 @@

void CicadaOCHelper::onPlayerStatusChanged(int64_t oldStatus, int64_t newStatus, void *userData) {
__weak CicadaPlayer * player = getOCPlayer(userData);
if (player && player.delegate && [player.delegate respondsToSelector:@selector(onPlayerStatusChanged:oldStatus:newStatus:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
__weak id<CicadaDelegate> theDelegate = getDelegate(userData);
dispatch_async(dispatch_get_main_queue(), ^{
if (theDelegate && [theDelegate respondsToSelector:@selector(onPlayerStatusChanged:oldStatus:newStatus:)]) {
[theDelegate onPlayerStatusChanged:player oldStatus:mapStatus(oldStatus) newStatus:mapStatus(newStatus)];
}

if (player && player.delegate && [player.delegate respondsToSelector:@selector(onPlayerStatusChanged:oldStatus:newStatus:)]) {
[player.delegate onPlayerStatusChanged:player oldStatus:mapStatus(oldStatus) newStatus:mapStatus(newStatus)];
});
}
}
});
}

void CicadaOCHelper::onEvent(int64_t code, const void *msg, void *userData) {
Expand Down
2 changes: 2 additions & 0 deletions platform/Apple/source/CicadaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,8 @@ OBJC_EXPORT
*/
@property (nonatomic, weak) id<CicadaDelegate> delegate;

- (void)setInnerDelegate:(id<CicadaDelegate>) delegate;

/**
@brief 设置AudioSession的Delegate
@param delegate Delegate对象
Expand Down
7 changes: 6 additions & 1 deletion platform/Apple/source/CicadaPlayer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,11 @@ - (void)stop
[self resetProperty];
}

- (void)setInnerDelegate:(id<CicadaDelegate>) delegate
{
mHelper->setDelegate(delegate);
}

-(void)destroy
{
if (mView) {
Expand Down Expand Up @@ -870,7 +875,7 @@ -(void) setPlaybackType:(CicadaPlaybackType)type
-(int64_t) getPlayingPts
{
if (self.player) {
self.player->GetMasterClockPts();
return self.player->GetMasterClockPts();
}
return 0;
}
Expand Down
2 changes: 2 additions & 0 deletions platform/Apple/source/CicadaPlayerSDK.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@
#import <CicadaPlayerSDK/CicadaDef.h>
#import <CicadaPlayerSDK/CicadaCacheConfig.h>
#import <CicadaPlayerSDK/CicadaPlayerGlobalSettings.h>
#import <CicadaPlayerSDK/CicadaSyncPlayer.h>
#import <CicadaPlayerSDK/CicadaSyncClientPlayer.h>
10 changes: 10 additions & 0 deletions platform/Apple/source/CicadaSyncPlayerClient.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

#import <Foundation/Foundation.h>
#import "CicadaPlayer.h"

@interface CicadaSyncPlayerClient : CicadaPlayer

- (instancetype)init;

@end

106 changes: 106 additions & 0 deletions platform/Apple/source/CicadaSyncPlayerClient.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@

#import "CicadaSyncPlayerClient.h"
#include <communication/messageServer.h>
#include "playerMessage.h"
#include <utils/af_clock.h>
#include <utils/frame_work_log.h>

using namespace Cicada;
using namespace std;
class syncServerListener;

@interface CicadaSyncPlayerClient()<CicadaDelegate>
{
af_clock masterClock;
}

@property (nonatomic, assign)bool isConnet;
@property (nonatomic, assign)messageClient *client;
@property (nonatomic, strong)NSTimer *mTimer;
@end

static string serverIp = "tcp://localhost:8888";

@implementation CicadaSyncPlayerClient

- (void)timerAction
{
if (!self.isConnet) {
self.isConnet = self.client->connect(serverIp) >= 0;
} else {
string msg = self.client->readMessage();
if (!msg.empty()) {
AF_LOGE("client msg %s\n", msg.c_str());
if (msg == playerMessage::start) {
[self start];
masterClock.start();
} else if (msg == playerMessage::pause) {
[self pause];
masterClock.pause();
} else if (msg == playerMessage::prepare) {
[self prepare];
} else if (msg == playerMessage::clock) {
int64_t pts = atoll(self.client->readMessage().c_str());
masterClock.set(pts);
if (llabs(pts - [self getPlayingPts]) > 40000) {
AF_LOGW("delta pts is %lld\n", pts - [self getPlayingPts]);
}
} else if (msg == playerMessage::seekAccurate) {
int64_t ms = atoll(self.client->readMessage().c_str());
[self seekToTime:ms seekMode:(CICADA_SEEKMODE_ACCURATE)];
} else if (msg == playerMessage::seek) {
int64_t ms = atoll(self.client->readMessage().c_str());
[self seekToTime:ms seekMode:(CICADA_SEEKMODE_INACCURATE)];
}
}
}
}

- (instancetype)init
{
self = [super init];
if (self) {
self.autoPlay = YES;
[super setInnerDelegate:self];

[self setPlaybackType:CicadaPlaybackTypeVideo];
[self SetClockRefer:^int64_t{
return masterClock.get();
}];
self.client = new messageClient();
int ret = self.client->connect(serverIp);
if (ret >= 0) {
self.isConnet = true;
} else {
self.isConnet = false;
}

self.mTimer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.mTimer forMode:NSDefaultRunLoopMode];
[self.mTimer fire];
}

return self;
}

#pragma mark CicadaDelegate
-(void)onPlayerEvent:(CicadaPlayer*)player eventWithString:(CicadaEventWithString)eventWithString description:(NSString *)description {
switch (eventWithString) {
case CICADA_EVENT_PLAYER_NETWORK_RETRY:
[player reload];
break;
default:
break;
}
}

-(void)destroy
{
if (nil != self.mTimer) {
[self.mTimer invalidate];
self.mTimer = nil;
}
[super destroy];
}

@end
10 changes: 10 additions & 0 deletions platform/Apple/source/CicadaSyncPlayerServer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

#import <Foundation/Foundation.h>
#import "CicadaPlayer.h"

@interface CicadaSyncPlayerServer : CicadaPlayer

- (instancetype)init;

@end

Loading

0 comments on commit c854037

Please sign in to comment.