Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
a7def3d5
Commit
a7def3d5
authored
Aug 02, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move one function, no functional changes
parent
960bdbbf
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
151 additions
and
152 deletions
+151
-152
src/audio_output/mixer.c
src/audio_output/mixer.c
+0
-152
src/audio_output/output.c
src/audio_output/output.c
+151
-0
No files found.
src/audio_output/mixer.c
View file @
a7def3d5
...
...
@@ -27,7 +27,6 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <assert.h>
#include <stddef.h>
#include <vlc_common.h>
...
...
@@ -79,154 +78,3 @@ void aout_MixerRun(audio_mixer_t *mixer, block_t *block, float amp)
{
mixer
->
mix
(
mixer
,
block
,
amp
);
}
/**
* Rearranges audio blocks in correct number of samples.
* @note (FIXME) This is left here for historical reasons. It belongs in the
* output code. Besides, this operation should be avoided if possible.
*/
block_t
*
aout_OutputSlice
(
audio_output_t
*
p_aout
,
aout_fifo_t
*
p_fifo
)
{
const
unsigned
samples
=
p_aout
->
i_nb_samples
;
/* FIXME: Remove this silly constraint. Just pass buffers as they come to
* "smart" audio outputs. */
assert
(
samples
>
0
);
vlc_assert_locked
(
&
p_aout
->
lock
);
/* Retrieve the date of the next buffer. */
date_t
exact_start_date
=
p_aout
->
fifo
.
end_date
;
mtime_t
start_date
=
date_Get
(
&
exact_start_date
);
/* See if we have enough data to prepare a new buffer for the audio output. */
aout_buffer_t
*
p_buffer
=
p_fifo
->
p_first
;
if
(
p_buffer
==
NULL
)
return
NULL
;
/* Find the earliest start date available. */
if
(
start_date
==
VLC_TS_INVALID
)
{
start_date
=
p_buffer
->
i_pts
;
date_Set
(
&
exact_start_date
,
start_date
);
}
/* Compute the end date for the new buffer. */
mtime_t
end_date
=
date_Increment
(
&
exact_start_date
,
samples
);
/* Check that start_date is available. */
mtime_t
prev_date
;
for
(
;;
)
{
/* Check for the continuity of start_date */
prev_date
=
p_buffer
->
i_pts
+
p_buffer
->
i_length
;
if
(
prev_date
>=
start_date
-
1
)
break
;
/* We authorize a +-1 because rounding errors get compensated
* regularly. */
msg_Warn
(
p_aout
,
"got a packet in the past (%"
PRId64
")"
,
start_date
-
prev_date
);
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
p_buffer
=
p_fifo
->
p_first
;
if
(
p_buffer
==
NULL
)
return
NULL
;
}
/* Check that we have enough samples. */
while
(
prev_date
<
end_date
)
{
p_buffer
=
p_buffer
->
p_next
;
if
(
p_buffer
==
NULL
)
return
NULL
;
/* Check that all buffers are contiguous. */
if
(
prev_date
!=
p_buffer
->
i_pts
)
{
msg_Warn
(
p_aout
,
"buffer hole, dropping packets (%"
PRId64
")"
,
p_buffer
->
i_pts
-
prev_date
);
aout_buffer_t
*
p_deleted
;
while
(
(
p_deleted
=
p_fifo
->
p_first
)
!=
p_buffer
)
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
}
prev_date
=
p_buffer
->
i_pts
+
p_buffer
->
i_length
;
}
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
mixer_format
)
)
{
p_buffer
=
p_fifo
->
p_first
;
/* Additionally check that p_first_byte_to_mix is well located. */
const
unsigned
framesize
=
p_aout
->
mixer_format
.
i_bytes_per_frame
;
ssize_t
delta
=
(
start_date
-
p_buffer
->
i_pts
)
*
p_aout
->
mixer_format
.
i_rate
/
CLOCK_FREQ
;
if
(
delta
!=
0
)
msg_Warn
(
p_aout
,
"input start is not output end (%zd)"
,
delta
);
if
(
delta
<
0
)
{
/* Is it really the best way to do it ? */
aout_FifoReset
(
&
p_aout
->
fifo
);
return
NULL
;
}
if
(
delta
>
0
)
{
mtime_t
t
=
delta
*
CLOCK_FREQ
/
p_aout
->
mixer_format
.
i_rate
;
p_buffer
->
i_nb_samples
-=
delta
;
p_buffer
->
i_pts
+=
t
;
p_buffer
->
i_length
-=
t
;
delta
*=
framesize
;
p_buffer
->
p_buffer
+=
delta
;
p_buffer
->
i_buffer
-=
delta
;
}
/* Build packet with adequate number of samples */
unsigned
needed
=
samples
*
framesize
;
p_buffer
=
block_Alloc
(
needed
);
if
(
unlikely
(
p_buffer
==
NULL
)
)
/* XXX: should free input buffers */
return
NULL
;
p_buffer
->
i_nb_samples
=
samples
;
for
(
uint8_t
*
p_out
=
p_buffer
->
p_buffer
;
needed
>
0
;
)
{
aout_buffer_t
*
p_inbuf
=
p_fifo
->
p_first
;
if
(
unlikely
(
p_inbuf
==
NULL
)
)
{
msg_Err
(
p_aout
,
"packetization error"
);
vlc_memset
(
p_out
,
0
,
needed
);
break
;
}
const
uint8_t
*
p_in
=
p_inbuf
->
p_buffer
;
size_t
avail
=
p_inbuf
->
i_nb_samples
*
framesize
;
if
(
avail
>
needed
)
{
vlc_memcpy
(
p_out
,
p_in
,
needed
);
p_fifo
->
p_first
->
p_buffer
+=
needed
;
p_fifo
->
p_first
->
i_buffer
-=
needed
;
needed
/=
framesize
;
p_fifo
->
p_first
->
i_nb_samples
-=
needed
;
mtime_t
t
=
needed
*
CLOCK_FREQ
/
p_aout
->
mixer_format
.
i_rate
;
p_fifo
->
p_first
->
i_pts
+=
t
;
p_fifo
->
p_first
->
i_length
-=
t
;
break
;
}
vlc_memcpy
(
p_out
,
p_in
,
avail
);
needed
-=
avail
;
p_out
+=
avail
;
/* Next buffer */
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
}
}
else
p_buffer
=
aout_FifoPop
(
p_fifo
);
p_buffer
->
i_pts
=
start_date
;
p_buffer
->
i_length
=
end_date
-
start_date
;
return
p_buffer
;
}
src/audio_output/output.c
View file @
a7def3d5
...
...
@@ -28,6 +28,7 @@
# include "config.h"
#endif
#include <assert.h>
#include <vlc_common.h>
#include <vlc_aout.h>
#include <vlc_aout_intf.h>
...
...
@@ -369,6 +370,156 @@ void aout_VolumeHardSet (audio_output_t *aout, float volume, bool mute)
/*** Buffer management ***/
/**
* Rearranges audio blocks in correct number of samples.
* @note (FIXME) This is left here for historical reasons. It belongs in the
* output code. Besides, this operation should be avoided if possible.
*/
block_t
*
aout_OutputSlice
(
audio_output_t
*
p_aout
,
aout_fifo_t
*
p_fifo
)
{
const
unsigned
samples
=
p_aout
->
i_nb_samples
;
/* FIXME: Remove this silly constraint. Just pass buffers as they come to
* "smart" audio outputs. */
assert
(
samples
>
0
);
vlc_assert_locked
(
&
p_aout
->
lock
);
/* Retrieve the date of the next buffer. */
date_t
exact_start_date
=
p_aout
->
fifo
.
end_date
;
mtime_t
start_date
=
date_Get
(
&
exact_start_date
);
/* See if we have enough data to prepare a new buffer for the audio output. */
aout_buffer_t
*
p_buffer
=
p_fifo
->
p_first
;
if
(
p_buffer
==
NULL
)
return
NULL
;
/* Find the earliest start date available. */
if
(
start_date
==
VLC_TS_INVALID
)
{
start_date
=
p_buffer
->
i_pts
;
date_Set
(
&
exact_start_date
,
start_date
);
}
/* Compute the end date for the new buffer. */
mtime_t
end_date
=
date_Increment
(
&
exact_start_date
,
samples
);
/* Check that start_date is available. */
mtime_t
prev_date
;
for
(
;;
)
{
/* Check for the continuity of start_date */
prev_date
=
p_buffer
->
i_pts
+
p_buffer
->
i_length
;
if
(
prev_date
>=
start_date
-
1
)
break
;
/* We authorize a +-1 because rounding errors get compensated
* regularly. */
msg_Warn
(
p_aout
,
"got a packet in the past (%"
PRId64
")"
,
start_date
-
prev_date
);
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
p_buffer
=
p_fifo
->
p_first
;
if
(
p_buffer
==
NULL
)
return
NULL
;
}
/* Check that we have enough samples. */
while
(
prev_date
<
end_date
)
{
p_buffer
=
p_buffer
->
p_next
;
if
(
p_buffer
==
NULL
)
return
NULL
;
/* Check that all buffers are contiguous. */
if
(
prev_date
!=
p_buffer
->
i_pts
)
{
msg_Warn
(
p_aout
,
"buffer hole, dropping packets (%"
PRId64
")"
,
p_buffer
->
i_pts
-
prev_date
);
aout_buffer_t
*
p_deleted
;
while
(
(
p_deleted
=
p_fifo
->
p_first
)
!=
p_buffer
)
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
}
prev_date
=
p_buffer
->
i_pts
+
p_buffer
->
i_length
;
}
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
mixer_format
)
)
{
p_buffer
=
p_fifo
->
p_first
;
/* Additionally check that p_first_byte_to_mix is well located. */
const
unsigned
framesize
=
p_aout
->
mixer_format
.
i_bytes_per_frame
;
ssize_t
delta
=
(
start_date
-
p_buffer
->
i_pts
)
*
p_aout
->
mixer_format
.
i_rate
/
CLOCK_FREQ
;
if
(
delta
!=
0
)
msg_Warn
(
p_aout
,
"input start is not output end (%zd)"
,
delta
);
if
(
delta
<
0
)
{
/* Is it really the best way to do it ? */
aout_FifoReset
(
&
p_aout
->
fifo
);
return
NULL
;
}
if
(
delta
>
0
)
{
mtime_t
t
=
delta
*
CLOCK_FREQ
/
p_aout
->
mixer_format
.
i_rate
;
p_buffer
->
i_nb_samples
-=
delta
;
p_buffer
->
i_pts
+=
t
;
p_buffer
->
i_length
-=
t
;
delta
*=
framesize
;
p_buffer
->
p_buffer
+=
delta
;
p_buffer
->
i_buffer
-=
delta
;
}
/* Build packet with adequate number of samples */
unsigned
needed
=
samples
*
framesize
;
p_buffer
=
block_Alloc
(
needed
);
if
(
unlikely
(
p_buffer
==
NULL
)
)
/* XXX: should free input buffers */
return
NULL
;
p_buffer
->
i_nb_samples
=
samples
;
for
(
uint8_t
*
p_out
=
p_buffer
->
p_buffer
;
needed
>
0
;
)
{
aout_buffer_t
*
p_inbuf
=
p_fifo
->
p_first
;
if
(
unlikely
(
p_inbuf
==
NULL
)
)
{
msg_Err
(
p_aout
,
"packetization error"
);
vlc_memset
(
p_out
,
0
,
needed
);
break
;
}
const
uint8_t
*
p_in
=
p_inbuf
->
p_buffer
;
size_t
avail
=
p_inbuf
->
i_nb_samples
*
framesize
;
if
(
avail
>
needed
)
{
vlc_memcpy
(
p_out
,
p_in
,
needed
);
p_fifo
->
p_first
->
p_buffer
+=
needed
;
p_fifo
->
p_first
->
i_buffer
-=
needed
;
needed
/=
framesize
;
p_fifo
->
p_first
->
i_nb_samples
-=
needed
;
mtime_t
t
=
needed
*
CLOCK_FREQ
/
p_aout
->
mixer_format
.
i_rate
;
p_fifo
->
p_first
->
i_pts
+=
t
;
p_fifo
->
p_first
->
i_length
-=
t
;
break
;
}
vlc_memcpy
(
p_out
,
p_in
,
avail
);
needed
-=
avail
;
p_out
+=
avail
;
/* Next buffer */
aout_BufferFree
(
aout_FifoPop
(
p_fifo
)
);
}
}
else
p_buffer
=
aout_FifoPop
(
p_fifo
);
p_buffer
->
i_pts
=
start_date
;
p_buffer
->
i_length
=
end_date
-
start_date
;
return
p_buffer
;
}
/*****************************************************************************
* aout_OutputNextBuffer : give the audio output plug-in the right buffer
*****************************************************************************
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment