FskErr FskNetInterfaceInitialize(void) { FskErr err; err = FskListMutexNew(&interfaceChangeCBList, "interfaceChangeCBLIst"); if (err) return err; #if TARGET_OS_WIN32 installWindowsNetworkInterfaceChangeTracker(); #elif TARGET_OS_IPHONE installIOSNetworkInterfaceChangeTracker(); #elif TARGET_OS_MAC installMacNetworkInterfaceChangeTracker(); #endif /* TARGET_OS */ #if TARGET_OS_KPL KplNetInterfaceInitialize(); KplNetInterfaceSetChangedCallback(KplNetInterfaceChanged, 0L); #endif /* TARGET_OS_KPL */ err = FskListMutexNew(&gNetworkInterfaceList, "gNetworkInterfaceList"); if (err) return err; FskMutexAcquire(gNetworkInterfaceList->mutex); sFskNetInterfaceEnumerate((FskNetInterfaceRecord**)(void*)&gNetworkInterfaceList->list); FskMutexRelease(gNetworkInterfaceList->mutex); return err; }
FskErr linuxDigitalNew(FskPinDigital *pin, SInt32 number, const char *name, FskPinsDigitalDirection direction) { FskErr err; FILE *f; linuxDigital ld; int file = -1; char buffer[50]; if (NULL == gLinuxDigitalPins) { err = FskListMutexNew(&gLinuxDigitalPins, "linux digital repeat thread"); if (err) return err; } f = fopen("/sys/class/gpio/export", "w"); if (!f) printf("failed to export pin\n"); if (!f) return kFskErrFileNotFound; fprintf(f, "%d", (int)number); fclose(f); err = FskMemPtrNewClear(sizeof(linuxDigitalRecord), (FskMemPtr *)&ld); if (err) return err; ld->pin = (int)number; ld->file = -1; ld->canInterrupt = false; FskListMutexAppend(gLinuxDigitalPins, &ld->next); snprintf(buffer, sizeof(buffer), "/sys/class/gpio/gpio%d/edge", ld->pin); file = open(buffer, O_WRONLY); if (file >= 0) { ld->canInterrupt = write(file, "both", 5) > 0; close(file); } *pin = (FskPinDigital)ld; return linuxDigitalSetDirection((FskPinDigital)ld, direction); }
FskErr KplDeviceNotifyPropertyChangedNew(UInt32 propertyID, KplPropertyChangedCallback proc, void *refcon) { FskErr err = kFskErrNone; KplPhoneNotify kpn; if (NULL == gPhoneNotify) FskListMutexNew(&gPhoneNotify, "PhoneNotify"); FskMemPtrNewClear(sizeof(KplPhoneNotifyRecord), (FskMemPtr *)&kpn); kpn->propertyID = propertyID; kpn->proc = proc; kpn->refcon = refcon; kpn->thread = KplThreadGetCurrent(); FskListMutexAppend(gPhoneNotify, kpn); #if TEST_PROPERTY_NOTIFIERS setupTestNotifier(propertyID); #endif return err; }
FskErr androidAudioOutNew(FskAudioOut *audioOutOut, UInt32 outputID, UInt32 format) { SLresult res; FskErr err = kFskErrNone; FskAudioOut audioOut = NULL; androidAudioExt *ext = NULL; int i; SLDataLocator_OutputMix loc_outmix; SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; SLDataFormat_PCM pcm; SLDataSink audioSnk; SLDataSource audioSrc = {&loc_bufq, &pcm}; if (NULL == audioOuts) { err = FskListMutexNew(&audioOuts, "audioOuts"); if (err) goto bail; } err = FskMemPtrNewClear(sizeof(FskAudioOutRecord), (FskMemPtr*)&audioOut); if (err) goto bail; err = FskMemPtrNewClear(sizeof(androidAudioExt), (FskMemPtr*)&ext); if (err) goto bail; err = FskMemPtrNewClear(AUDIO_DATA_BUFFER_SIZE, (FskMemPtr*)&ext->audioBuf[0]); if (err) goto bail; err = FskMemPtrNewClear(AUDIO_DATA_BUFFER_SIZE, (FskMemPtr*)&ext->audioBuf[1]); if (err) goto bail; ext->nextBuf = 0; ext->audioFilled[0] = 0; ext->audioFilled[1] = 0; audioOut->ext = ext; ext->parent = audioOut; audioOut->thread = FskThreadGetCurrent(); audioOut->format = kFskAudioFormatPCM16BitLittleEndian; audioOut->sampleRate = 44100; audioOut->numChannels = 2; ext->sampleSize = audioOut->numChannels * 2; if (sBufferedSamplesTarget > 0 && sBufferedSamplesTarget < 20) { audioOut->bufferedSamplesTarget = sBufferedSamplesTarget * audioOut->sampleRate * ext->sampleSize; } else audioOut->bufferedSamplesTarget = audioOut->sampleRate * ext->sampleSize; // 1 second default SLboolean required[MAX_NUMBER_INTERFACES]; SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; pcm.formatType = SL_DATAFORMAT_PCM; pcm.numChannels = audioOut->numChannels; pcm.samplesPerSec = audioOut->sampleRate * 1000; pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; pcm.containerSize = 16; pcm.channelMask = audioOut->numChannels == 1 ? SL_SPEAKER_FRONT_CENTER : (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT); pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; for (i=0; i<MAX_NUMBER_INTERFACES; i++) { required[i] = SL_BOOLEAN_FALSE; iidArray[i] = SL_IID_NULL; } res = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, (void*)&ext->EngineItf); CheckErr("GetInterface", res); res = (*ext->EngineItf)->CreateOutputMix(ext->EngineItf, &ext->outputMixObject, 0, NULL, NULL); CheckErr("CreateOutputMix", res); res = (*ext->outputMixObject)->Realize(ext->outputMixObject, SL_BOOLEAN_FALSE); CheckErr("Realize OutputMix", res); loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; loc_outmix.outputMix = ext->outputMixObject; audioSnk.pLocator = &loc_outmix; audioSnk.pFormat = NULL; iidArray[0] = SL_IID_BUFFERQUEUE; required[0] = SL_BOOLEAN_TRUE; res = (*ext->EngineItf)->CreateAudioPlayer(ext->EngineItf, &ext->player, &audioSrc, &audioSnk, 1, iidArray, required); CheckErr("CreateAudioPlayer", res); res = (*ext->player)->Realize(ext->player, SL_BOOLEAN_FALSE); CheckErr(" player->Realize", res); res = (*ext->player)->GetInterface(ext->player, SL_IID_PLAY, (void*)&ext->playItf); CheckErr(" ext->player->GetInterface Play", res); res = (*ext->player)->GetInterface(ext->player, SL_IID_BUFFERQUEUE, (void*)&ext->bufferQueueItf); CheckErr(" player->GetInterface BufferQueue", res); res = (*ext->bufferQueueItf)->RegisterCallback(ext->bufferQueueItf, BufferQueueCallback, ext); CheckErr(" bufferQueueItf->RegisterCallback BufferQueue", res); // res = (*ext->volumeItf)->SetVolumeLevel(ext->volumeItf, -300); // CheckErr(" volumeItf->SetVolumeLevel", res); // if (gAudio) // FskAudioNativePrintfDebug("- about to trash existing gAudio %x", gAudio); FskListMutexNew(&audioOut->blocks, "audio blocks"); FskMutexNew(&ext->getSamplePositionMutex, "audio getSamplePosition"); FskListMutexAppend(audioOuts, audioOut); bail: if (err) { androidAudioOutDispose(audioOut); audioOut = NULL; } *audioOutOut = audioOut; return err; }