playing a song on another device using bluetooth
Asked Answered
F

2

9

i have this playlist of the songs in my app.I want to play a song from this playlist on anther device (iphone) using bluetooth.

This is what i have done so for

#import "BrowseStationsViewController.h"

@interface BrowseStationsViewController (){
GKSession *gkSession;
}

@end

@implementation BrowseStationsViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
 }

#pragma mark - 
  - (void)viewDidLoad
{
   [super viewDidLoad];
// Do any additional setup after loading the view

   [self setupSession];

NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];

// Register for notifications when the application leaves the background state
// on its way to becoming the active application.
[defaultCenter addObserver:self
                  selector:@selector(setupSession)
                      name:UIApplicationWillEnterForegroundNotification
                    object:nil];

// Register for notifications when when the application enters the background.
[defaultCenter addObserver:self
                  selector:@selector(teardownSession)
                      name:UIApplicationDidEnterBackgroundNotification
                    object:nil];


       }

- (void)didReceiveMemoryWarning
 {
 [super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
   }



     #pragma mark - GKSession setup and teardown

  - (void)setupSession
 {
gkSession = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer];
gkSession.delegate = self;
gkSession.disconnectTimeout = kDisconnectTimeout;
gkSession.available = YES;

self.title = [NSString stringWithFormat:@"GKSession: %@", gkSession.displayName];
   }

 - (void)teardownSession
 {
[gkSession disconnectFromAllPeers];
gkSession.available = NO;
gkSession.delegate = nil;
 }


 #pragma mark - GKSessionDelegate protocol conformance

 - (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:     (GKPeerConnectionState)state
{
switch (state)
{
    case GKPeerStateAvailable:
    {
        NSLog(@"didChangeState: peer %@ available", [session displayNameForPeer:peerID]);

        [NSThread sleepForTimeInterval:kSleepTimeInterval];

        [session connectToPeer:peerID withTimeout:kConnectionTimeout];
        break;
    }

    case GKPeerStateUnavailable:
    {
        NSLog(@"didChangeState: peer %@ unavailable", [session displayNameForPeer:peerID]);
        break;
    }

    case GKPeerStateConnected:
    {
        NSLog(@"didChangeState: peer %@ connected", [session displayNameForPeer:peerID]);
        break;
    }

    case GKPeerStateDisconnected:
    {
        NSLog(@"didChangeState: peer %@ disconnected", [session displayNameForPeer:peerID]);
        break;
    }

    case GKPeerStateConnecting:
    {
        NSLog(@"didChangeState: peer %@ connecting", [session displayNameForPeer:peerID]);
        break;
    }
}

[self.tableView reloadData];
     }


- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString  *)peerID
   {
NSLog(@"didReceiveConnectionRequestFromPeer: %@", [session displayNameForPeer:peerID]);

[session acceptConnectionFromPeer:peerID error:nil];

[self.tableView reloadData];
   }

    - (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error
  {
NSLog(@"connectionWithPeerFailed: peer: %@, error: %@", [session displayNameForPeer:peerID], error);

[self.tableView reloadData];
    }

 - (void)session:(GKSession *)session didFailWithError:(NSError *)error
  {
NSLog(@"didFailWithError: error: %@", error);

[session disconnectFromAllPeers];

[self.tableView reloadData];
    }

 #pragma mark - UITableViewDataSource protocol conformance

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
// We have 5 sections in our grouped table view,
// one for each GKPeerConnectionState
return 3;
   }

   - (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
  {
NSInteger rows;

NSInteger peerConnectionState = section;

switch (peerConnectionState)
{
    case GKPeerStateAvailable:
    {
        NSArray *availablePeers = [gkSession peersWithConnectionState:GKPeerStateAvailable];
        rows = availablePeers.count;
        break;
    }

    case GKPeerStateConnected:
    {
        NSArray *connectedPeers = [gkSession peersWithConnectionState:GKPeerStateConnected];
        rows = connectedPeers.count;
        break;
    }

    case GKPeerStateUnavailable:
    {
        NSArray *unavailablePeers = [gkSession peersWithConnectionState:GKPeerStateUnavailable];
        rows = unavailablePeers.count;
        break;
    }
}

// Always show at least 1 row for each GKPeerConnectionState.
if (rows < 1)
{
    rows = 1;
}

return rows;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = nil;

NSInteger peerConnectionState = section;

switch (peerConnectionState)
{
    case GKPeerStateAvailable:
    {
        headerTitle = @"Available Peers";
        break;
    }


    case GKPeerStateConnected:
    {
        headerTitle = @"Connected Peers";
        break;
    }


    case GKPeerStateUnavailable:
    {
        headerTitle = @"Unavailable Peers";
        break;
    }
}

return headerTitle;
 }

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString * cellId = @"Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if(!cell){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId];
}


NSInteger peerConnectionState = indexPath.section;

NSArray *peers = nil;

switch (peerConnectionState)
{
    case GKPeerStateAvailable:
    {
        peers = [gkSession peersWithConnectionState:GKPeerStateAvailable];
        break;
    }

    case GKPeerStateConnected:
    {
        peers = [gkSession peersWithConnectionState:GKPeerStateConnected];
        break;
    }


    case GKPeerStateUnavailable:
    {
        peers = [gkSession peersWithConnectionState:GKPeerStateUnavailable];
        break;
    }
}

NSInteger peerIndex = indexPath.row;

if ((peers.count > 0) && (peerIndex < peers.count))
{
    NSString *peerID = [peers objectAtIndex:peerIndex];

    if (peerID)
    {
        cell.textLabel.text = [gkSession displayNameForPeer:peerID];
    }
}

return cell;
 }

  @end

please see the screen shot

Now i have no idea how to proceed.Could someone please help me out??By selecting a song can it be played on another device??

Friesland answered 4/9, 2013 at 5:36 Comment(4)
Apple will most likely reject your app if you use GameKit but your app isn't an actual game.Delwyn
Some details please?because i am using Gamekit.ThanksFriesland
GameKit is for games. Apple do not allow it to be used if your app isn't a game. Even if the app has game like features but isn't really a game they will usually reject it.Delwyn
Now i have no idea how to proceed without Gamekit.I could use Corebluetooth but that only works with BLE.Friesland
P
1

GameKit is meant for inter-device games. For this, you'd probably want to look at CBPeripheralManager or CBCentralManager depending on the device you're interacting with. It's lower level, so you'll have to do more work to set up the connection, but there's tons of tutorials and sample code to help you out.

Psid answered 5/9, 2013 at 1:34 Comment(2)
What if a platform doesn't support Bluetooth Low Energy??I can't use it then right??Friesland
So i have to go with Gamekit.Framework or some other framework but i have no idea how to proceed:(Friesland
H
0

Ok lets get to the point where you are stuck.. You can use the same logic with some other libraries but this is how it should go. You will have to send the song data in chunks and sync to the other device while the previous chunk is received on the other end. Since we are clear that bluetooth does not have a great band width u will have to specifically tune your transmission rate to the other device. once a chunk is received on the device sent to your app instance running on that device should play it.. and in parallel probe for the newer chunks coming in from the sending device.. On the receiving end u can simply use FIFO method for handling the incoming chunks of your song data.

Hesitate answered 13/9, 2013 at 6:30 Comment(3)
GameKit is for games. Apple do not allow it to be used if your app isn't a game. Even if the app has game like features but isn't really a game they will usually reject it. – WainFriesland
Somehow i got it working using the same logic in this raywenderlich.com/12865/… now i am stuck again :(Friesland
The approach is correct, i did check the link that you mentioned.. but just try to use some other available kit other than a gamekit since Apple is doing a filter..Hesitate

© 2022 - 2024 — McMap. All rights reserved.