python c example2:pylame2
#include <Python.h>
#include <lame.h> //pyton object variables
typedef struct{
PyObject_HEAD
FILE *outfp;
lame_global_flags *gfp;
} pylame2_EncoderObject; static PyObject *Encoder_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
pylame2_EncoderObject *self = (pylame2_EncoderObject *)type->tp_alloc(type, );
self->outfp = NULL;
self->gfp = NULL;
return (PyObject *)self;
} static void Encoder_dealloc(pylame2_EncoderObject *self)
{
if(self->gfp)
{
lame_close(self->gfp);
}
if(self->outfp)
{
fclose(self->outfp);
}
self->ob_type->tp_free(self);
} static int Encoder_init(pylame2_EncoderObject * self, PyObject *args, PyObject *kw)
{
char *outpath;
if(!PyArg_ParseTuple(args, "s", &outpath))
{
return -;
}
if(self->outfp || self->gfp)
{
PyErr_SetString(PyExc_Exception, "__init__ already called");
return -;
}
self->outfp = fopen(outpath, "wb");
self->gfp = lame_init();
lame_init_params(self->gfp);
return ;
} static PyObject *Encoder_encode(pylame2_EncoderObject *self, PyObject *args)
{
char *in_buffer;
int in_length;
int mp3_length;
char *mp3_buffer;
int mp3_bytes;
if(!(self->outfp && self->gtp))
{
PyErr_SetString(PyExc_Exception, "encoder not open");
return NULL;
}
if(!PyArg_ParseTuple(args, "s#", &in_buffer, &in_length))
{
return NULL;
}
in_length /=;
mp3_length = (int)(1.25 * in_length) + ;
mp3_buffer = (char*)malloc(mp3_length);
if(in_length > )
{
mp3_bytes = lame_encode_buffer_interleaved(
self->gtp,
(short *)in_buffer,
in_length / ,
mp3_buffer,
mp3_length
);
if(mpe3_bytes > )
{
fwrite(mp3_buffer, , mp3_bytes, self->outfp);
}
}
free(mp3_buffer);
Py_RETURN_NONE;
}
static PyObject *Encoder_close(pylame2_EncoderObject * self)
{
int mp3_length;
char * mp3_buffer;
int mpe3_bytes;
if(!(self->outfp && self->gfp))
{
PyErr_SetString(PyExc_Exception, "encoder not open");
return NULL;
}
mp3_length = ;
mp3_buffer = (char*)malloc(mp3_length);
mp3_bytes = lame_encode_flush(self->gfp, mp3_buffer, sizeof(mp3_buffer));
if(mp3_bytes > )
{
fwrite(mp3_buffer, , mp3_bytes, self->outfp);
}
free(mp3_buffer);
lame_close(self->gfp);
self->gfp = NULL;
fclose(self->outfp);
self->outfp = NULL;
Py_RETURN_NONE;
}
static PyMethodDef Encoder_methods[] ={
{"encode", (PyCFunction)Encoder_encode, METH_VARARGS, "Encodes and writes data to the output file."},
{"close", (PyCFunction)Encoder_close, METH_NOARGS, "Closes the output file."},
{NULL, NULL, , NULL}
};
static PyTypeObject pylame2_EncoderType = {
PyObject_HEAD_INIT(NULL)
, /* ob_size */
"pylame2.Encoder", /* tp_name */
sizeof(pylame2_EncoderObject), /* tp_basicsize */
, /* tp_itemsize */
(destructor)Encoder_dealloc, /* tp_dealloc */
, /* tp_print */
, /* tp_getattr */
, /* tp_setattr */
, /* tp_compare */
, /* tp_repr */
, /* tp_as_number */
, /* tp_as_sequence */
, /* tp_as_mapping */
, /* tp_hash */
, /* tp_call */
, /* tp_str */
, /* tp_getattro */
, /* tp_setattro */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"My first encoder object.", /* tp_doc */
, /* tp_traverse */
, /* tp_clear */
, /* tp_richcompare */
, /* tp_weaklistoffset */
, /* tp_iter */
, /* tp_iternext */
Encoder_methods, /* tp_methods */
, /* tp_members */
, /* tp_getset */
, /* tp_base */
, /* tp_dict */
, /* tp_descr_get */
, /* tp_descr_set */
, /* tp_dictoffset */
(initproc)Encoder_init, /* tp_init */
, /* tp_alloc */
Encoder_new, /* tp_new */
, /* tp_free */
}; static PyMethodDef pylame2_methods[] = {
{NULL, NULL, , NULL}
}; PyMODINIT_FUNC initpylame2(){
PyObject *m;
if(PyType_Ready(&pylame2_EncoderType) < )
{
return;
}
m = Py_InitModule3("pylame2", pylame2_methods, "My Second LAME module.");
Py_INCREF(&pylame2_EncoderType);
PyModule_AddObject(m, "Encoder", (PyObject *)&pylame2_EncoderType);
}; /*
gcc -shared -I/usr/include/pytyon3.1 -I/usr/include/lame pylame2.c -lmp3lame -o pylame2.so
*/
/*python code
import pylame2 INBUFSIZE = 4096 encoder = pylame2.Encoder('test.mp3')
input = file('test.raw', 'rb')
data = input.read(INBUFSIZE) while data != '':
encoder.encode(data)
data = input.read(INBUFSIZE) input.close()
encoder.close()
*/
use the python object's methods in c code
#include <Python.h>
#include <lame.h> //pyton object variables
typedef struct{
PyObject_HEAD
//FILE *outfp;
PyObject *outfp;
lame_global_flags *gfp;
} pylame2_EncoderObject; static PyObject *Encoder_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
pylame2_EncoderObject *self = (pylame2_EncoderObject *)type->tp_alloc(type, );
self->outfp = NULL;
self->gfp = NULL;
return (PyObject *)self;
} static void Encoder_dealloc(pylame2_EncoderObject *self)
{
if(self->gfp)
{
lame_close(self->gfp);
}
/*
if(self->outfp)
{
fclose(self->outfp);
}*/
Py_XDECREF(self->outfp);
self->ob_type->tp_free(self);
} static int Encoder_init(pylame2_EncoderObject * self, PyObject *args, PyObject *kw)
{
//char *outpath;
PyObject *outfp;
if(!PyArg_ParseTuple(args, "O", &outfp))
{
return -;
}
if(self->outfp || self->gfp)
{
PyErr_SetString(PyExc_Exception, "__init__ already called");
return -;
}
//self->outfp = fopen(outpath, "wb");
self->outfp = outfp;
Py_INCREF(self->outfp);
self->gfp = lame_init();
lame_init_params(self->gfp);
return ;
} static PyObject *Encoder_encode(pylame2_EncoderObject *self, PyObject *args)
{
char *in_buffer;
int in_length;
int mp3_length;
char *mp3_buffer;
int mp3_bytes;
if(!(self->outfp && self->gtp))
{
PyErr_SetString(PyExc_Exception, "encoder not open");
return NULL;
} if(!PyArg_ParseTuple(args, "s#", &in_buffer, &in_length))
{
return NULL;
}
in_length /=;
mp3_length = (int)(1.25 * in_length) + ;
mp3_buffer = (char*)malloc(mp3_length); if(in_length > )
{
mp3_bytes = lame_encode_buffer_interleaved(
self->gtp,
(short *)in_buffer,
in_length / ,
mp3_buffer,
mp3_length
);
if(mpe3_bytes > )
{
//fwrite(mp3_buffer, 1, mp3_bytes, self->outfp);
PyObject * write_result = PyObject_CallMethod(self->outfp, "write", "(s#)", mp3_buffer, mp3_bytes);
if(!write_result)
{
free(mp3_buffer);
return NULL;
}
Py_DECREF(write_result);
}
}
// free(mp3_buffer);
// Py_RETURN_NONE;
}
static PyObject *Encoder_close(pylame2_EncoderObject * self)
{
int mp3_length;
char * mp3_buffer;
int mpe3_bytes;
if(!(self->outfp && self->gfp))
{
PyErr_SetString(PyExc_Exception, "encoder not open");
return NULL;
}
mp3_length = ;
mp3_buffer = (char*)malloc(mp3_length);
mp3_bytes = lame_encode_flush(self->gfp, mp3_buffer, sizeof(mp3_buffer));
if(mp3_bytes > )
{
fwrite(mp3_buffer, , mp3_bytes, self->outfp);
}
free(mp3_buffer);
lame_close(self->gfp);
self->gfp = NULL;
fclose(self->outfp);
self->outfp = NULL;
Py_RETURN_NONE;
}
static PyMethodDef Encoder_methods[] ={
{"encode", (PyCFunction)Encoder_encode, METH_VARARGS, "Encodes and writes data to the output file."},
{"close", (PyCFunction)Encoder_close, METH_NOARGS, "Closes the output file."},
{NULL, NULL, , NULL}
};
static PyTypeObject pylame2_EncoderType = {
PyObject_HEAD_INIT(NULL)
, /* ob_size */
"pylame2.Encoder", /* tp_name */
sizeof(pylame2_EncoderObject), /* tp_basicsize */
, /* tp_itemsize */
(destructor)Encoder_dealloc, /* tp_dealloc */
, /* tp_print */
, /* tp_getattr */
, /* tp_setattr */
, /* tp_compare */
, /* tp_repr */
, /* tp_as_number */
, /* tp_as_sequence */
, /* tp_as_mapping */
, /* tp_hash */
, /* tp_call */
, /* tp_str */
, /* tp_getattro */
, /* tp_setattro */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"My first encoder object.", /* tp_doc */
, /* tp_traverse */
, /* tp_clear */
, /* tp_richcompare */
, /* tp_weaklistoffset */
, /* tp_iter */
, /* tp_iternext */
Encoder_methods, /* tp_methods */
, /* tp_members */
, /* tp_getset */
, /* tp_base */
, /* tp_dict */
, /* tp_descr_get */
, /* tp_descr_set */
, /* tp_dictoffset */
(initproc)Encoder_init, /* tp_init */
, /* tp_alloc */
Encoder_new, /* tp_new */
, /* tp_free */
}; static PyMethodDef pylame2_methods[] = {
{NULL, NULL, , NULL}
}; PyMODINIT_FUNC initpylame2(){
PyObject *m;
if(PyType_Ready(&pylame2_EncoderType) < )
{
return;
}
m = Py_InitModule3("pylame2", pylame2_methods, "My Second LAME module.");
Py_INCREF(&pylame2_EncoderType);
PyModule_AddObject(m, "Encoder", (PyObject *)&pylame2_EncoderType);
}; /*
gcc -shared -I/usr/include/pytyon3.1 -I/usr/include/lame pylame2.c -lmp3lame -o pylame2.so
*/
/*python code
import pylame2 INBUFSIZE = 4096 class MyFile(file):
def __init__(self, path, mode):
file.__init__(self, path, mode)
self.n = 0 def write(self, s):
file.write(self, s)
self.n += 1 output = MyFile('test3.mp3', 'wb')
encoder = pylame2.Encoder(output)
input = file('test.raw', 'rb') data = input.read(INBUFSIZE)
while data !='':
encoder.encode(data)
data = input.read(INBUFSIE) input.close()
encoder.close()
output.close() print("output.write was called %d times" % output.n)
*/
python c example2:pylame2的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- 使用Python将HTML转成PDF
主要使用的是wkhtmltopdf的Python封装--pdfkit 安装 1. Install python-pdfkit: $ pip install pdfkit 2. Install wkht ...
- python——协程
由于python中的多线程比较特殊,所以协程的概念就变得尤为珍贵了,对于cpu密集型的操作,使用协程的效率无疑要好过多线程很多.因为协程的创建及其间切换的时间成本要低于线程很多.也因为这一点,很多人说 ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...
- python学习笔记-Day6(2)
xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...
- Python:如何显示进度条
首先,推荐一个组件:progressive 效果如下: 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过std ...
- Think Python - Chapter 11 - Dictionaries
Dictionaries A dictionary is like a list, but more general. In a list, the indices have to be intege ...
- python多线程threading
本文通过 4个example 介绍python中多线程package —— threading的常用用法, 包括调用多线程, 同步队列类Queue, Ctrl+c结束多线程. example1. 调用 ...
- 一行 Python 实现并行化 -- 日常多线程操作的新思路
春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...
随机推荐
- UWP 程序抛出异常时总是跳到“global::System.Diagnostics.Debugger.Break();”的解决办法
调试 C# 程序时,如果遇到异常,VS 会中断,指出导致异常的语句.但是最近调试 UWP 程序时,发现总是在“global::System.Diagnostics.Debugger.Break();” ...
- Asp.Net MVC part3 路由Route
路由Route路由规则Route:可以查看源代码了解一下构造方法,需要指定路由格式.默认值.处理器三个值路由数据RouteData:当前请求上下文匹配路由规则而得到的一个对象,可以在Action中通过 ...
- Java下String逗号数组和List<String>的互相转换
说明:很遗憾,组装的时候只能遍历. 方法: public static String listToString(List<String> list){ if(list==null){ re ...
- 【mybatis】mybatis中insert 主键自增和不自增的插入情况【mysql】
主键不自增:返回值是插入的条数 <insert id="add" parameterType="EStudent"> insert into TSt ...
- sqlmapapi的跨域访问Access-Control-Allow-Origin:*;ajax
1.做sqlmapapi的二次开发时,需要通过ajax方式调用sqlmapapi,但是默认情况下,sqlmapapi是不允许跨域访问的 2.尝试增加ajax的header,修改origin的值,来避免 ...
- 使用.reg文件删除暴风影视库图标和注册信息
暴风播放器安装后会自动安装一个叫暴风影音库的软件,在你的电脑资源管理器中增加了一个“暴风影视库”的图标.看着很烦,删起来还比较麻烦,于是搜索了相关资源,自己写了个注册表处理文件,方便大家一键删除之. ...
- Java笔记6:多态
一.多态的分类对象的多态性:动物 x = new 猫();函数的多态性:函数重载.重写 二.多态的体现父类的引用指向了自己的子类对象父类的引用也可以接收自己的对象 三.多态的前提必须是类与类之间只有关 ...
- 关于 iOS 证书,你必须了解的知识
收录待用,修改转载已取得腾讯云授权 最新腾讯云技术公开课直播,提问腾讯W3C代表,如何从小白成为技术专家?点击了解活动详情. 作者 |陈泽滨 编辑 | 顾乡 从事iOS开发几年,越来越发现,我们的开发 ...
- Robomongo与MongoDB的故事
Robomongo,Mongo可视化工具 哇唔,事实上她是三(阴险脸). 你看你看,界面清新,让人家心旷神怡(害羞).谁还想win+R+mongo呀呀呀?! 哎呀呀,继续···说正事. 在这里···借 ...
- 注册表 API 以及开机自启动
注册表是window系统中非常重要的一部分,今天在网上查了一些文章学习了下,觉得其中有一句话总结的很经典:注册表是用来存储信息的. 这句话虽然有点废,但是说的没错.当然,注册表中包含的内容非常多,远没 ...