Monday, February 25, 2008

vs2008 ฮ่าอ่าอะ

จับมาไม่นาน ต้อง config อะไรนักนะ
การ Dev บน Dot net framework c#

เมื่อวานได้เล่นเรื่อง unsafe
เราสามารถใส่เกี่ยวกับ pointer บน c# ได้ โดยให้มันรู้ว่าเป็น unmanage code ด้วย keywork unsafe
จะใส่เฉพาะที่ function หรือ ที่ class เลยก็ได้ ยังไม่รู้ว่าต่างกันยังไง
เพราะยังไงก็ต้อง enable unsafe mode ใน project configuration อยู่ดี เป็น checkbox อยู่อะ

สองสามวันนี้มีการเอา โปรเจคอื่น อย่าง speex เอามาใช้โดย c#
หาวิธี compile ให้เป็น dll ด้วยนการเลือกให้เป็น dynamic output ที่ project config เหมือนกัน
แต่ต้องทำ dll_export เองอะ ใช้ extern แล้ว c# มองไม่เห็น อย่าถามว่าทำไม เค้าว่าเป็นเรื่องของ assembly code อะไรก็ไม่รู้

แต่ก่อนนี้ก็พยายามทำโปรเจค c++ มาเป็นตัว wrapper ประมาณเรียกว่า mixmoide ให้มันเป็น manage code ให้ c# เรียกได้
ติดที่ว่า เวลา include file header .h เข้ามาแล้ว กะใส่ lib เข้ามาใน project configuration แล้ว ก็ยังมีปัญหา เต้แก้โดยการใส่ full path ของ lib file เลย ในช่อง Additional library (ชื่ออาจจะยังผิดๆ ขออภัย ไว้ว่างๆจะมาแก้ให้ถูก)
เอาเป็นว่า ความรู้ใหม่ เวลาดึง lib ไปใช้ ต้องใช้ทั้ง .h และ dll ด้วย ไม่ใช่ lib เฉยๆ

แต่ speex ก็ยังมีปัญฆาอยู่เ เพราะเอามา encryp ไฟล์เล็กๆดังไม่ได้ ได้แต่ file ใหญ่
เพราะเราใช้ code ตรง โปรเจคตัวอย่าง

ถัดมาลองดูเรื่อง encode แบบอื่นบ้าง ก็ได้ นี่ A-Law กะ mu-Law (ตัว มิวอะ ไม่รู้ code) encoder/decoder ซึ่งใน CodeProject มีเป็น c# ให้ด้วย

ทั้ง 2 ตัวเป็น algorithm ของการ encoding แบบ G.711 ซึ่งเป็นการ encode vocoder แบบเก่า
เหมาะกับเสียงพูด ประสิทธิภาพ ลดขนาด byte ลงได้ครึ่งนึง คสามแตกต่างของทั้งสองน่าจะเป็นที่มาตรฐานของ IP Phone ที่ A-Law มี support มากกว่า แต่ mu-law ทำได้ดีกว่า มีการลด all zero bit ได้ด้วย (ไม่มีอ้างอิง อ่านๆเดาๆเอา ใครรูจริงก็เข้ามาว่าได้เลยนะครับ ไว้ถ้ารู้เมื่อไหร่จะเอามา update)

เลยเลือกใช้ mu-law เข้ากับ project ผม

เจอปัญหาคือผมมา encode ในโปรเจค streaming ซึ่งไม่รู้มันทำยังงี้กันไหม คือ ตัดทีละ packet udp ส่งไปเรื่อยๆ ทีละ 1k ดังนั้น เวลา encode ก็จะต้อง encode ทีละ pack ซึ่งผม encode ที่ 16k แล้วค่อยตัดส่งทีละ 1k ตอนรับ ก็รวมจนมันเป็น 8k แล้วก็เอามา decode กลับ (มันลดได้ครึงนึงพอดีเด๊ะแน่นอนอยู่แล้ว เลยใช้หารสองเลย)

ปัญหาคือ เกิดเสียง ตุ้บ ตุ้บ ตุ้บ เป็นจังหวะตลอด เหมือน ทุกครั้งที่เป็นช่วงต่อ มันจะมีเสียงตุ้บ
ยังไม่รู้จะแก้ยังไง

และพอเล่นๆไป เสียงจะมีอาการกระโดด เหมือนเล่นเลยแล้ว มาเล่น packet เดิม เอาเป็นแบบนี้ คือ
1 2 3 4 5 6 ควรเล่นต่อๆกันไป
แต่มันเล่นแบบ 1 4 2 3 6 5 มีการกระโดดไปเล่น packet อื่นเฉย เพราะมันเป็น udp เหรอ งั้นซวยละสิ ทำไงดีหว่า...

i.i
(โปรแกรมเมอร์อั่ว#1)

No comments: