⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio.cc

📁 一个共享源码的音频库4
💻 CC
字号:
// This file contains no license whatsoever. It is provided in the public domain as an example// of how to use the audio library//// Bruce Forsberg// forsberg@tns.net// //#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <X11/X.h>extern "C"{#include <Xm/Xm.h>}#include "gui.h"#include "audio.h"#include "aflibConfig.h"#include "aflibFile.h"#include "aflibAudioFile.h"#include "aflibAudioSpectrum.h"#include "aflibAudioRecorder.h"#include "aflibAudioPitch.h"#include "aflibData.h"#include "aflibSampleData.h"#include <string>#define PLAY_DELTA 2048static int play_delta = PLAY_DELTA;static bool play = FALSE;static bool timer_record = FALSE;static aflibAudio  *input = NULL;static aflibAudioSpectrum  *spec = NULL;static aflibAudioRecorder *recorder = NULL;static aflibAudioPitch *pitch= NULL;static aflibAudio  *output = NULL;static aflibConfig     input_config;static long long  position = 0;static long long  total_size = 0;static long long  samples_per_second = 0;static string play_file;static string device_file;static double pitch_value = 1.0;static bool pitch_enable = FALSE;Booleanwork_app(XtPointer client_data){   aflibStatus  status;   int num_samples = play_delta;   if (timer_record == TRUE)   {      recorder->process(status, 0, num_samples);      if (status != AFLIB_SUCCESS)      {         audio_stop();      }      usleep(1);   }   else if (play == TRUE)   {      output->process(status, position, num_samples);      if (status != AFLIB_SUCCESS)      {         audio_stop();      }      position += num_samples;      gui_set_slider_position(position, total_size, samples_per_second);   }   else   {      usleep(1);   }   return FALSE;}voidaudio_spectrum(int array_size, double *db_array){   gui_spectrum(array_size, db_array);}voidaudio_play(char * _play){   aflibStatus status;   if (_play != NULL)   {      play_file = _play;   }   // If no chain then create   if (output == NULL)   {      input = new aflibAudioFile(AFLIB_AUTO_TYPE, play_file.c_str(),         &input_config, &status);      if (status != AFLIB_SUCCESS)      {         delete input;         input = NULL;         cerr << "Can't play file " << play_file.c_str() << endl;         return;      }      spec = new aflibAudioSpectrum(*input);      spec->setParameters(32, 8, 2);      spec->setAudioSpectrumCallback(audio_spectrum);      pitch = new aflibAudioPitch(*spec, pitch_value);      pitch->enable(pitch_enable);      //pitch->setCacheEnable(FALSE);      aflibConfig output_config(input_config);      output = new aflibAudioFile(*pitch, AFLIB_DEV_TYPE, device_file.c_str(),         &output_config, &status);      if (status != AFLIB_SUCCESS)      {         delete input;         delete spec;         delete output;         input = NULL;         output = NULL;         spec = NULL;         cerr << "Can't open output device " << device_file.c_str() << endl;         return;      }      total_size = output_config.getTotalSamples();      samples_per_second = output_config.getSamplesPerSecond();      play_delta = (int)(PLAY_DELTA * ((double)samples_per_second / 44100.0));      gui_set_channels(output_config.getChannels());      gui_set_bits(output_config.getBitsPerSample());      // Just display the file name with no directory path      int pos = play_file.rfind("/");      string file_str = play_file.substr(pos + 1);      gui_set_file(file_str);      gui_set_format(((aflibAudioFile *)input)->getFormat());#if 0      int num_samples = 10000;      aflibData * _data = output->process(status, 0, num_samples, FALSE);      FILE *fd = fopen ("data.fil", "w");      for (int i = 0; i < 10000; i++)      {         fprintf(fd, "%d %d\n", i, _data->getSample(i, 0));      }      delete _data;      fclose(fd);#endif   }   play = TRUE;}voidaudio_record(   const char * _play,   aflibConfig& config,   const string& format){   aflibStatus status;   if (_play != NULL)   {      play_file = _play;   }   // If no chain then create   if (output == NULL)   {      input_config = config;      input = new aflibAudioFile(AFLIB_DEV_TYPE, device_file.c_str(),         &input_config, &status);      if (status != AFLIB_SUCCESS)      {         delete input;         input = NULL;         cerr << "Can't open input device " << device_file.c_str() << endl;         return;      }      total_size = input_config.getTotalSamples();      samples_per_second = input_config.getSamplesPerSecond();      play_delta = (int)(PLAY_DELTA * ((double)samples_per_second / 44100.0));      spec = new aflibAudioSpectrum(*input);      spec->setParameters(32, 8, 2);      spec->setAudioSpectrumCallback(audio_spectrum);      output = new aflibAudioFile(*spec, format, play_file.c_str(),         &input_config, &status);      if (status != AFLIB_SUCCESS)      {         delete input;         delete spec;         delete output;         input = NULL;         output = NULL;         spec = NULL;         cerr << "Can't create output file " << play_file.c_str() << endl;         return;      }      gui_set_channels(input_config.getChannels());      gui_set_bits(input_config.getBitsPerSample());      // Just display the file name with no directory path      int pos = play_file.rfind("/");      string file_str = play_file.substr(pos + 1);      gui_set_file(file_str);      gui_set_format(format);   }   play = TRUE;}voidaudio_timer_record(   aflibAudio * base_ptr){   aflibStatus status;   aflibDateTime start_date, stop_date;   string  file;   string file_type;   long long max_limit;   long long each_limit;   aflibConfig config;   // If no chain then create   if (output == NULL)   {      recorder = (aflibAudioRecorder *)base_ptr;      int segs = recorder->getNumberOfRecordItems();      if (segs == 0)      {         return;      }      recorder->getRecordItem(1,         start_date, stop_date, file,         file_type, max_limit, each_limit, config);      input_config = config;      input = new aflibAudioFile(AFLIB_DEV_TYPE, device_file.c_str(),         &input_config, &status);      total_size = input_config.getTotalSamples();      samples_per_second = input_config.getSamplesPerSecond();      spec = new aflibAudioSpectrum(*input);      spec->setParameters(32, 5, 2);      spec->setAudioSpectrumCallback(audio_spectrum);      recorder->addParent(*spec);   }   timer_record = TRUE;}voidaudio_pause(){   play = FALSE;}voidaudio_stop(){   play = FALSE;   position = 0;   delete pitch;   pitch = NULL;   delete spec;   spec = NULL;   delete output;   output = NULL;   delete input;   input = NULL;   // If recording turn off   gui_set_record_mode(FALSE);}voidaudio_device( const char * device ){   device_file = device;}voidaudio_set_position(int pos){   position = (pos * total_size) / 100;}voidaudio_set_pitch(double factor){   pitch_value = factor;   if (pitch)   {      pitch->setFactor(pitch_value, 0.95);   }}voidaudio_pitch(){   // Toggle the state of the pitch enable button   if (pitch_enable == TRUE)      pitch_enable = FALSE;   else      pitch_enable = TRUE;   // IF pitch is an active object then change its state   if (pitch)      pitch->enable(pitch_enable);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -