From 66b009b5ad69dab69d09ee32e61d1ce36dda7ea6 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Sun, 16 Oct 2016 20:55:50 +0100 Subject: Added raw sound to ogg/vorbis converter --- README.md | 1 + raw2ogg/Makefile | 2 + raw2ogg/raw2vorbis.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 raw2ogg/Makefile create mode 100644 raw2ogg/raw2vorbis.c diff --git a/README.md b/README.md index 5eaaf57..6e937d5 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,4 @@ hex_editor_1k - cli hex editor http_show - CGI that outputs what have been sended to it mini_irc - can connect and reply on PM,chat messages and join chan alsa-record-sound - record sound with alsa, 48kHz,2ch +raw2vorbus - convert raw audio file 48kHz,2ch recorded with alsa-record-sound to ogg format and then you can play it witn mplayer diff --git a/raw2ogg/Makefile b/raw2ogg/Makefile new file mode 100644 index 0000000..bb2d678 --- /dev/null +++ b/raw2ogg/Makefile @@ -0,0 +1,2 @@ +make: + gcc raw2vorbis.c -o raw2vorbis -logg -lvorbis -lvorbisenc diff --git a/raw2ogg/raw2vorbis.c b/raw2ogg/raw2vorbis.c new file mode 100644 index 0000000..5643695 --- /dev/null +++ b/raw2ogg/raw2vorbis.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include +#include + +#include + +#define READ_SZ 1024 +signed char readbuffer[READ_SZ*4+44]; + +int main(int argc, char **argv) +{ + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the user comments */ + + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + int eos=0,ret; + int i, founddata; + FILE *fin=NULL,*fout=NULL; + + /* get input/output files from input */ + if (argc != 3) + { + printf("%s [input] [output]\n",argv[0]); + exit(1); + } + + fin = fopen(argv[1],"r"); + if (fin == NULL) + { + printf("Cant open file %s\n", argv[1]); + exit(1); + } + + fout = fopen(argv[2],"w"); + if (fout == NULL) + { + printf("Cant open file %s\n", argv[2]); + exit(1); + } + + /* encoding setup */ + vorbis_info_init(&vi); + + ret=vorbis_encode_init_vbr(&vi,2,44100,-.1); + if (ret) + { + printf("Cant setup encode mode\n"); + exit(1); + } + + /* add comment */ + vorbis_comment_init(&vc); + vorbis_comment_add_tag(&vc, "ENCODER", "encoder_example.c"); + + /* set up the analysis state and auxiliary encoding storage */ + vorbis_analysis_init(&vd, &vi); + vorbis_block_init(&vd, &vb); + + /* set up our packet->stream encoder */ + /* pick a random serial number; that way we can more likely build + chained streams just by concatenation */ + srand(time(NULL)); + ogg_stream_init(&os, rand()); + + /* Vorbis streams begin with three headers; the initial header (with + most of the codec setup parameters) which is mandated by the Ogg + bitstream spec. The second header holds any comment fields. The + third header holds the bitstream codebook. We merely need to + make the headers, then pass them to libvorbis one at a time; + libvorbis handles the additional Ogg bitstream constraints */ + + { + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout(&vd, &vc, &header, &header_comm, &header_code); + ogg_stream_packetin(&os, &header); /* automatically placed in its own + page */ + ogg_stream_packetin(&os, &header_comm); + ogg_stream_packetin(&os, &header_code); + + /* This ensures the actual + * audio data will start on a new page, as per spec + */ + while(!eos) + { + int result=ogg_stream_flush(&os, &og); + if(result==0) + break; + fwrite(og.header, 1, og.header_len, fout); + fwrite(og.body, 1, og.body_len, fout); + } + } + + while (!eos) + { + long i; + long bytes = fread(readbuffer, 1, READ_SZ*4, fin); + + if (bytes == 0) + { + vorbis_analysis_wrote(&vd, 0); + } else + { + float **buffer = vorbis_analysis_buffer(&vd, READ_SZ); + /*do i need interleaver samples*/ + for (i=0; i