Hacker Rank: Pairs

刚注册上 Hacker Rank ,出现了一条练手的题目,竟然不是著名的 Hello World ,而是这题 Pairs 。 连接 题目是这样的 Given N integers [N<=10^5], count the total pairs of integers that have a difference of K. [K>0 and K<1e9]. Each of the N integers will be greater than 0 and at least K away from 2^31-1 (Everything can be done with 32 bit integers). Input Format 1st line contains N & K (integers). 2nd line contains N numbers of the set. All the N numbers are assured to be distinct. ...

October 11, 2013

向android frameworks 添加自定义系统服务

以添加控制LED的服务为例子简述 android 系统服务的编写。 ##分析 首先需要知道的是android 之所以能够提供系统服务,是因为进程间通信,系统服务一直在后台运行。当程序想使用这些服务的时候,只要申请使用就可以了。android使用自己的Binder实现了这种进程间通行。 我想实现一个控制LED的系统服务,但是不需要过度了解 Binder, 只需要在系统服务的框架中添加相应的代码就可以了。 ##实现 ###定义接口 aidl文件定义了服务端提供的接口 :::java //ILEDManager.aidl package android.app; interface ILEDManager { void setWifiLED(boolean flag); void setApLED(boolean flag); } 定义好好需要在编译文件添加文件。 :::java //Android.mk core/java/android/app/ILEDManager.aidl \ ###接口实现代码 定义了接口后,就需要实现服务端逻辑了。 :::java //LEDManagerService.java package com.android.server; import android.util.Slog; import android.os.IBinder; import android.os.Binder; import android.content.Context; import android.app.LEDManager; import android.app.ILEDManager; public class LEDManagerService extends ILEDManager.Stub{ private static final String TAG = "LEDManagerService"; private LightsService mLightsService; private Context mContext; private final LightsService.Light mWifiLight; private final LightsService.Light mApLight; public LEDManagerService(Context context, LightsService lights){ this.mContext = context; this.mLightsService = lights; mWifiLight = mLightsService.getLight(LightsService.LIGHT_ID_WIFI); mApLight = mLightsService.getLight(LightsService.LIGHT_ID_AP); } public void setWifiLED(boolean flag){ if(mWifiLight != null){ if(flag){ mWifiLight.setColor(1); }else{ mWifiLight.turnOff(); } } } public void setApLED(boolean flag){ if(mApLight != null){ if(flag){ mApLight.setColor(1); }else{ mApLight.turnOff(); } } } } ###加载 ...

September 25, 2013

向android系统添加ape音频格式(第二部分)

编译出了libapedec.so,后需要知道如何用这个库。 主要还是看MACLib.h这个头文件,因为我们要调的主要接口都在这个头文件中。其中有以下几个 :::c APE::IAPEDecompress * __stdcall CreateIAPEDecompress(const APE::str_utfn * pFilename, int * pErrorCode = NULL); 传入参数是文件名和错误代码的int指针,返回的是这个解码器的句柄IAPEDecompress。先获得APE的音频数据及相关信息,就要先调用此函数初始化解码器并获得其句柄。 :::c class IAPEDecompress { public: // destructor (needed so implementation's destructor will be called) virtual ~IAPEDecompress() {}; virtual int GetData(char * pBuffer, int nBlocks, int * pBlocksRetrieved) = 0; virtual int Seek(int nBlockOffset) = 0; virtual intn GetInfo(APE_DECOMPRESS_FIELDS Field, intn nParam1 = 0, intn nParam2 = 0) = 0; }; 获得了句柄后,就可以使用里面的函数获取我们需要的信息,例如GetInfo可以获得APE文件的相关信息,GetData可以获得解码后的数据,Seek可以跳转到APE数据的指定位置。 只要用好这些方法,就可以了,问题是如何在stagefright上面用。 ...

September 10, 2013

向android系统添加ape音频格式(第一部分)

要向Android系统添加一种音频格式,需要对stagefright有一定的了解,在android源码里的libstagefright文件夹里面,可以看到一大堆的Extractor,也就是各种格式的解码器了。我们就是要这里写一个APEExtractor。 撇开Android框架不说,我们还不知道要如何把APE格式的数据解为pcm,所以重中之重是先找到解析APE的方法。 ##Monkey’s audio 开源的力量很强大,APE的解码器不用自己苦逼的实现了,只要到http://www.monkeysaudio.com/下载源码,然后根据android平台修改下,编译成库,供框架调用就可以了。 说起来轻松,有些知识还是需要知道的。所以现在的目标就是把APE解码器编译成libmonkeysaudio.so ##Android.mk 要编译成库,最主要是写好Android.mk。下载下来的解码器的源码版本是4.12,也就是MAC_SDK_412.zip,解压后发现其代码没有Makefile,而且project只有vs2012和xcode两个版本。忍了。 Readme.txt 中有这么一句话 If you use C++, it’s recommended that you simply statically link to maclib.lib 所以熟悉其源码后发现用到的代码目录只有两个MACLib和Shared,其他可以扔垃圾桶了。 把这两个文件夹放到一个叫做libmonkeysaudio文件夹中,然后移到android源码中external目录,开始做代码修改。 首先是在MACLib 目录把md5.h改名为MD5.h,在Shared目录的All.h 里定义好环境为LINUX。 在libmonkeysaudio文件夹下编写Android.mk文件,内容如下 :::sh LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:=libmonkeysaudio LOCAL_SRC_FILES := \ MACLib/APECompressCore.cpp \ MACLib/APECompress.cpp \ MACLib/APECompressCreate.cpp \ MACLib/APEDecompress.cpp \ MACLib/APEHeader.cpp \ MACLib/APEInfo.cpp \ MACLib/APELink.cpp \ MACLib/APESimple.cpp \ MACLib/APEtag.cpp \ MACLib/BitArray.cpp \ MACLib/MACLib.cpp \ MACLib/MACProgressHelper.cpp \ MACLib/md5.cpp \ MACLib/NewPredictor.cpp \ MACLib/NNFilter.cpp \ MACLib/Prepare.cpp \ MACLib/UnBitArrayBase.cpp \ MACLib/UnBitArray.cpp \ MACLib/WAVInputSource.cpp \ Shared/CharacterHelper.cpp \ Shared/CircleBuffer.cpp \ Shared/GlobalFunctions.cpp \ Shared/StdLibFileIO.cpp \ Shared/WinFileIO.cpp LOCAL_C_INCLUDES += \ external/libmonkeysaudio/MACLib \ external/libmonkeysaudio/Shared include $(BUILD_SHARED_LIBRARY) PS:好好利用下面命令可以快速整理好要编译的文件。 ...

September 1, 2013

DLNA/UPNP相关理论

之前炒得很热的多屏互动,其中就用到了upnp技术。 简单地说,upnp就是通过一些列网络协议,实现了网络内各种设备的通讯和数据传输。其中用到的网络协议有 基于HTTP的**SSDP(Simple Service Discovery Protocol)**作用是网络中的设备发现。 基于UDP的**GENA(General Event Notification Architecture)**事件通知框架,看到UDP就知道其是非可靠传输,一般用作控制设备或者回应时的消息协议。 基于TCP的**SOAP(Simple Object Access Protocol)**简单对象访问协议。 UPnP定义了通用的设备与控制点之间的交互协议,包括寻址、发现、描述、控制、事件、展示等部分,如下图: 寻址:设备通过DHCP或Auto-IP自动获取一个IP地址,并测试及定时检查地址可用性。 发现:通过SSDP协议,当设备加入网络时向控制点宣告其可用服务。同样,当控制点加入网络时允许其搜索到感兴趣的设备。 描述:使用XML形式,让控制点了解设备及其提供的功能。描述包括设备描述、服务描述、非标准厂商扩展等。 控制:采用SOAP协议(Web Service协议),控制点向服务发出动作,设备服务执行后返回结果或错误码。或者控制点查询服务的状态变量值。 事件:当服务状态变量发生改变时,发布者(服务)向订阅者发送事件消息,提醒订阅者状态变量改变。控制点采用GENA协议订阅服务所提供的事件。 展示:控制点采用浏览器获得设备展示页面。 ##Upnp影音架构 除了定义了上面的基本的通信行为,upnp还定义了一个AV架构。 UPnP定义的基本影音设备包括MediaServer(媒体服务器)、MediaRenderer(媒体渲染器)。其中MediaServer服务包括:AVTransport(AVT)、ConnectionManager(CM)、ContentDirectory(CDS)等,MediaRenderer服务包括:AVTransport(AVT)、ConnectionManager(CM)、RenderingControl(RCS)等。 基本上mediaserver是内容的提供者,controlpoint通过控制mediaserver,mediarenderer从mediaserver里取得数据并播放,那么mediarenderer就是内容的呈现者。 Control Point调用MediaServer的CDS::Browser/Search动作,获取MediaServer内容目录对象 Control Point调用MediaRenderer的CM::GetProtocolInfo动作,获取MediaRenderer支持的数据格式 Control Point对支持的格式进行内容选择 Control Point分别调用MediaServer及MediaRenderer的CM::PrepareForConnection建立连接 Control Point调用MediaRenderer的AVT::SetAVTransportURI动作,设置内容URI路径 Control Point调用MediaRenderer的AVT::Play动作,启动播放 MediaServer与MediaRenderer之间通过HTTP GET进行内容传输 Control Point调用MediaRenderer的RCS::SetVolumn动作,设置音量 内容传输完成,根据需要设置下一首音乐的URI Control Point分别调用MediaServer及MediaRenderer的CM::ConnectionComplete终止连接 ##DLNA 至于DLNA,就是在upnp的基础上,定了更多的标准,来实现家庭影音互动,其核心基础就是upnp。

August 29, 2013