User talk:KennyTM~

Discussion page of User:KennyTM~
Revision as of 22:55, 18 August 2010 by Yllier (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Dear Kenny,

I have an idea of an application which can record audio stream of the phone call. What do you think? Is it realistic?

From the list of the devices I can see that iPhone has "AppleBasebandAudio" device. I can open this device. I wrote a simple application based on your FLASH example but I cannot find selector address anywhere.

#include <stdlib.h>
#include <stdio.h>
#include <CoreFoundation/CFDictionary.h>
#include <IOKit/IOKitLib.h>

int main(int argc, char *argv[])
{
  // Get the service named "AppleBasebandAudio".
  CFMutableDictionaryRef matching = IOServiceMatching("AppleBasebandAudio");
  io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, matching);

  // Open a connection to the AppleBasebandAudio service
  io_connect_t connect;
  kern_return_t errcode = IOServiceOpen(service, mach_task_self(), 0, &connect);


  // Send some message to the service and get the result.
  // using one of the IOConnectCall*** methods.
  if (errcode == 0) {

    size_t infoSize;
    size_t osize = sizeof(infoSize);
    errcode = IOConnectCallStructMethod(
                                      connect, 0xFE000200, // selector
                                      NULL, 0,             // input
                                      &infoSize, &osize);  // output
    if (errcode == 0) {
      void* info = malloc(infoSize);
      IOConnectCallStructMethod(connect, 0xFE000100, NULL, 0, info, &infoSize);

      // do_something_with(info);
      FILE *f;
      f = fopen ( "audioBuf.bin", "wb" ) ;
      if ( f == NULL )
      {
        printf ( "Cannot open source file" ) ;
        fclose ( f ) ;
        exit ( 1 );
      }
        fwrite( info, sizeof(char), infoSize, f );
      free(info);
    }
    else
      printf("Error code 1 %i\n", errcode);

    IOServiceClose(connect);
  }
  else
    printf("Error code 2 %i\n", errcode);

  IOObjectRelease(service);

  return 0;
}

I'm still puzzled with the selector. What address should I use?

Is this the right device responsible for the audio during phone call? Is there any event generated when the the phone accepts/makes a phone call? I looked at the files in \IOKit\hid\ but could not find any phone call specific events.

Could you advice some documentation which might help me? I would be grateful any information on this topic.

Kind regards,

Sergey

I don't think you can get the audio streams via IOHID. IOHID is meant to pass messages or similar Even on a mac there is no straight forward solution for capturing audio. Instead developers of apps like Sunflower and Jock OS X had to go via coding drivers (either kext or userland), making that driver accept the audio stream of apps...