2010年5月25日 星期二

終於完成自己的mp3 flash player

公司回家後,每天晚上做到三四點也不知道在high什麼
自己爽成這樣......
不過終於完成自己的網頁播放器真的很爽
我在一篇部落格看到,教你怎放播放器
<中文註解 by Jinn : http://blog.yam.com/jinnsblog>
後來修改完以後,歌曲+config檔+playlist檔全部都修改,還放到自己的hinet網路空間去
最差的是只有60M的網路空間可以放,滿殘念的
就先降吧~~~~
要自己做一個的人自己下載吧~~
裡面有教學
是一個好人翻譯的,真感謝他
我有把他傳到我的網頁空間去
要的人可以自行下載來試
http://www.megaupload.com/?d=3ZNPYF0L

 ps.享受你自己 luxurious 的 player 吧

2010年5月7日 星期五

Comptine d'un autre été: l'après midi

Android2.1 Message 從頂層到底層架構flow(2)

媽的我這樣寫真是前無古人後無來者
來吧,上面的framework丟到parcel裡面去
RILRequest初始化的時候,會連接名為rild的socket(也就是rild中s_listen_event綁定的socket),初始化數據傳輸的通道.
rr.mp 是Parcel對象,Parcel是一套簡單的序列化協議,用於將對象(或對象的成員)序列化成字節流,以供傳遞參數之用.這裡可以看到String address和int clirMode都是將依次序列化的成員.在這之前,rr初始化的時候,request號跟request的序列號(自動生成的遞增數),已經成為頭兩個 將被序列化的成員.這為後面的request解析打下了基礎.
接下來是send到handleMessage的流程,send將rr直接傳遞給另 一個線程的handleMessage,handleMessage執行data = rr.mp.marshall()執行序列化操作, 並將data字節流寫入到rild socket.
csdn的opendroid專欄的GSM驅動模塊rild詳細分析
看看就好,從CSDN的opendroid專欄寫過來的上面那一段,不過他是寫dial流程啦,message我還沒寫呢!正要開始,看官注意了!
進入
hardware/ril/libril/ril_event.cpp
------->
n = select(nfds, &rfds, NULL, NULL, ptv);
------->
firePending();
------->
ev->func(ev->fd, 0, ev->param);
------->
ev->func = func;
------->
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param)
------>
hardware/ril/libril/ril.cpp
------->
static void listenCallback (int fd, short flags, void *param)
上面階段都是listenCallback在調用的=="
------->
ril_event_set (&s_commands_event, s_fdCommand, 1,processCommandsCallback, p_rs);
------->
static void processCommandsCallback(int fd, short flags, void *param)
------->
processCommandBuffer(p_record, recordlen);
------->
RequestInfo *pRI
------->
typedef struct RequestInfo {
int32_t token; //this is not RIL_Token
CommandInfo *pCI;
struct RequestInfo *p_next;
char cancelled;
char local; // responses to local commands do not go back to command process
} RequestInfo;
------->
這裡的pRI就是一個RequestInfo結構指針, 從socket過來的數據流, 前面提到是Parcel處理過的序列化字節流, 這裡會通過反序列化的方法提取出來. 最前面的是request號, 以及token域(request的遞增序列號). 我們更關注這個request號, 前面提到, 上層和rild之間, 這個號是統一的. 它的定義是一個包含ril_commands.h的枚舉, 在ril.cpp中
------->
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
------->
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;
------->
pRI->pCI->dispatchFunction(p, pRI);
對照表在ril_commands.h
找我們message的
{RIL_REQUEST_SEND_SMS, dispatchStrings, responseSMS}
走dispatchStrings
------->
static void dispatchString (Parcel& p, RequestInfo *pRI)
------->
s_callbacks.onRequest(pRI->pCI->requestNumber, string8, sizeof(char *), pRI)
------->
/hardware/ril/reference-ril/reference-ril.c
------->
onRequest (int request, void *data, size_t datalen, RIL_Token t)
------->
case RIL_REQUEST_SEND_SMS:
requestSendSMS(data, datalen, t);
break;
------->
requestSendSMS(void *data, size_t datalen, RIL_Token t)
------->
hardware/ril/reference-ril/atchannel.c
------->
at_send_command_sms(cmd1, cmd2, "+CMGS:", &p_response);
------->
at_send_command_full
------->
at_send_command_full_nolock
------->
err = writeline (command);
寫下去吧= =
------->
written = write (s_fd, s + cur, len - cur);
=======>

tired= =..

Android2.1 Message 從頂層到底層架構flow(1)

今天終於有空來寫下message的心得了
忙碌了好久....這篇大家可以轉貼只不過要標示下作者.
在android2.1/package/apps/Mms//src/com/android/mms/ui/ComposeMessageActivity.java
下面有mSendButton就從這邊開始吧,這邊就是系統裡面的message這個application的send按鈕.
從Interface Methods 往下看進入confirmSendMessageIfNeeded().---->sendMessage(true).
接下來在ComposeMessageActivity裡面的sendMessage的mWorkingMessage.send()進入android/mms/data/WorkingMessage.java的send()裡面可以看到prepareForSave確保文字以拷貝.如果是短信的話,就直接跑sendSmsWorker()調用SmsMessageSender sender.sendMessage(threadID).可以看到的是SmsMessagSender在Mms/transaction/SmsMessageSender的路徑.在sendMessage的函數中可以看到有切割的方法在最後面的smsManager.sendMultipartTextMessage()可以看到把message傳到framework傳出去.


接下來到framework
frameworks/base/telephony/java/android/teleph/SmsManager.java
------->
sendTextMessage(destinationAddress,scAddress,parts.get(0),
sentIntent, deliveryIntent);
------->
iccISms.sendText(destinationAddress, scAddress, joshlinkingutf, sentIntent, deliveryIntent);(預設是跑gsmˊˋ)
=======>
frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
------->
sendText(String destAddr, String scAddr, String text,PendingIntent sentIntent, PendingIntent deliveryIntent)
------->
sendRawPdu(pdu.encodedScAddress, text.getBytes(), sentIntent, deliveryIntent);
------->
frameworks/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java
------->
sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,PendingIntent deliveryIntent)
------->
sendSms(tracker);
------->
mCm.sendSMS(IccUtils.bytesToHexString(smsc),joshlinkingbytesToString, reply);
------->
/frameworks/base/telephony/java/com/android/internal/telephony/RIL.java
------->
sendSMS (String smscPDU, String pdu, Message result)
------->
RILRequest rr= RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);
(rr是以RIL_REQUEST_SEND_SMS為request號而申請的一個RILRequest對象.這個request號在java框架和rild庫中共享(參考RILConstants.java中這些值的由來,下面hardware/ril用這個command來判斷要作什麼)
send(rr);

------->
send(RILRequest rr)
------->
mSender.obtainMessage(EVENT_SEND, rr);
------->
RILSender mSender;
------->
class RILSender extends Handler implements Runnable;
------->
case EVENT_SEND:
------->
s = mSocket;(開到hardware/ril的socket)


先到這邊吧好累,下去就是c++了還有c

2010年5月6日 星期四

Bob Sinclar & Sahara feat. Shaggy "I Wanna"

cscope trace Java

最近寫了一個vim用的cscope trace Java的script檔
滿不錯得,自己覺得自己寫得挺好的.
將tracejava.sh放在
帳號主目錄 ~/bin 的下面就可以在任何地方打上tracejava.sh就可以用了,挺好的^^~
如下面所示
$ cd ~
$ mkdir bin
$ PATH=~/bin:$PATH
$ chmod a+x ~/bin/repo

或是可以再自己的主目錄下面的.bashrc
加一行

export PATH=${PATH}:~/bin
這樣都可以讓自己的tracejava.sh再任何地方都可以使用

http://www.xun6.com/file/501c91837/tracejava.sh.html

這是我第一篇網誌,也不知道有誰會來^^不過大家能來就是我的福氣
script is free ,enjoy