return len;
}
+
+int ast_frame_adjust_volume(struct ast_frame *f, int adjustment)
+{
+ int count;
+ short *fdata = f->data;
+
+ if ((f->frametype != AST_FRAME_VOICE) || (f->subclass != AST_FORMAT_SLINEAR))
+ return -1;
+
+ for (count = 0; count < f->samples; count++) {
+ if (adjustment > 0) {
+ fdata[count] *= abs(adjustment);
+ } else if (adjustment < 0) {
+ fdata[count] /= abs(adjustment);
+ }
+ }
+
+ return 0;
+}
int samples;
/*! Was the data malloc'd? i.e. should we free it when we discard the frame? */
int mallocd;
- /*! How far into "data" the data really starts */
+ /*! How many bytes exist _before_ "data" that can be used if needed */
int offset;
/*! Optional source of frame for debugging */
const char *src;
};
#define AST_FRIENDLY_OFFSET 64 /*! It's polite for a a new frame to
- have this number of bytes for additional
- headers. */
+ have this number of bytes for additional
+ headers. */
#define AST_MIN_OFFSET 32 /*! Make sure we keep at least this much handy */
/*! Need the header be free'd? */
return (format == AST_FORMAT_ILBC) ? 30 : 20;
}
+/*!
+ \brief Adjusts the volume of the audio samples contained in a frame.
+ \param f The frame containing the samples (must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR)
+ \param adjustment The number of dB to adjust up or down.
+ \return 0 for success, non-zero for an error
+ */
+int ast_frame_adjust_volume(struct ast_frame *f, int adjustment);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif