#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的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. 使用Python将HTML转成PDF

    主要使用的是wkhtmltopdf的Python封装--pdfkit 安装 1. Install python-pdfkit: $ pip install pdfkit 2. Install wkht ...

  3. python——协程

    由于python中的多线程比较特殊,所以协程的概念就变得尤为珍贵了,对于cpu密集型的操作,使用协程的效率无疑要好过多线程很多.因为协程的创建及其间切换的时间成本要低于线程很多.也因为这一点,很多人说 ...

  4. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  5. python学习笔记-Day6(2)

    xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...

  6. Python:如何显示进度条

    首先,推荐一个组件:progressive 效果如下: 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过std ...

  7. Think Python - Chapter 11 - Dictionaries

    Dictionaries A dictionary is like a list, but more general. In a list, the indices have to be intege ...

  8. python多线程threading

    本文通过 4个example 介绍python中多线程package —— threading的常用用法, 包括调用多线程, 同步队列类Queue, Ctrl+c结束多线程. example1. 调用 ...

  9. 一行 Python 实现并行化 -- 日常多线程操作的新思路

    春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...

随机推荐

  1. Djanog|requirements.txt生成

    Django | requirement.txt 生成 pip django 1   pip 通常我们熟悉使用的都是 pip, 这个工具确实方便项目管理依赖包.当想把当前项目依赖的包的名称和版本导入指 ...

  2. [POI2014]Hotel

    题目大意: 给你一颗$n(n\le5000)$个点的树,选3个点使得它们两两距离相等,问共有几种选法. 思路: 首先我们不难发现一个性质:对于每3个符合条件的点,我们总能找到一个点使得这个点到那3个点 ...

  3. Exercise02_17

    import javax.swing.JOptionPane; public class FrostTemperature { public static void main(String[] arg ...

  4. Oracle TRCA 工具 说明 10046

    本篇文章主要介绍了"Oracle TRCA 工具 说明 ",主要涉及到Oracle TRCA 工具 说明 方面的内容,对于Oracle TRCA 工具 说明 感兴趣的同学可以参考一 ...

  5. Bootstrap响应式折叠导航

    浏览器宽度缩小到一定值时,导航显示为 <nav class="navbar navbar-inverse navbar-fixed-top" role="navig ...

  6. Oracle JET 起步

    Oracle JET介绍 Oracle JET是一个用于经验丰富的JavaScript开发人员构建客户端的基于JavaScript的应用程序的工具包.(抱歉本人对JavaScript绝对是从零开始) ...

  7. 使用Nmon监控Linux的系统性能

    Nmon(得名于 Nigel 的监控器)是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的一款计算机性能系统监控工具.Nmon 可以把操作系统的统计数据展示在屏幕上 ...

  8. javascript专业八级测试答案整理

    前几天社区的群里森破发了一个这样的链接: http://ourjs.com/detail/52fb82e13bd19c4814000001 做了一遍后突然对人生感到了迷茫,本着不能只有我一个人伤心的原 ...

  9. web应用程序指识别中的指纹收集

    web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ...

  10. HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)

    HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...